프로그래밍 공부/Java

[JAVA] JVM이란?

1. JVM이란?

JVM이란 JAVA Virtual Machine, 자바 가상 머신의 약자를 따서 줄여 부르는 용어이다
(가상머신은 프로그램 실행을 위해 물리적 머신과 유사한 머신을 소프트웨어로 구현한 것.)

  • 자바 애플리케이션은 클래스 로더를 통해 읽어들여 자바 API와 함께 실행한다.
  • 자바 바이트 코드를 실행할 수 있는 주체다.
    • Bytecode는 클래스 단위(.class)로 생성되므로, 프로그램의 수정이 일어나더라도 전체 소스코드를 다시 컴파일할 필요가 없다.
  • Java가 OS에 구애받지 않고 재사용 가능하게 해준다. (중개자의 역할)
  • 메모리 관리, Garbage Collection을 수행한다.
  • 스택 기반의 가상 머신

2. 왜 자바 가상머신을 알아야 하는가?

한정된 메모리를 효율적으로 사용하여 최고의 성능을 내기 위해서!

메모리 효율성을 위해 동일한 기능의 프로그램이더라도 메모리 관리에 따라 성능이 좌우된다. 메모리 관리가 되지 않은 경우 속도저하 현상이나 튕김 현상 등이 일어날 수 있다. 그래서, 알아두면 좋다를 넘어서 알아야 하는 것이다.

 

3. JVM의 구조

Class Loader, Exection engine, Runtime Data Area, JNI, Native Method Library로 이루어져 있다.

 

3.1 Class Loader(클래스 로더)

JVM내로 클래스를 로드하고 링크를 통해 배치하는 작업을 수행하는 모듈 런타임시 동적으로 클래스를 로드한다.

  • jar파일 내 저장된 클래스들을 JVM위에 탑재 + 사용하지 않는 클래스 메모리에서 삭제.
  • 자바는 동적코드, 컴파일 타임이 아니라 런타임에 참조한다.  = 클래스를 처음으로 참조할 때, 해당 클래스를 로드하고 링크함

 

3.2 Execution Engine(실행 엔진)

Class Loader를 통해 JVM 내의 런타임 데이터 영역에 배치된 바이트 코드를 실행한다.

  • 자바 바이트코드는 비교적 인간이 보기 편한 형태로 기술됨.  =바이트코드를 실제로 JVM내부에서 기계가 실행할 수 있는 형태로 변경해야 됨.
    • Interpreter(인터프리터) : 명령어 단위로 읽어서 실행. 한 줄 씩 수행하기 때문에 느림
    • JIT(Just - In - Time) : 인터프리터 방식의 단점을 보완하기 위해 도입.  인터프리터 방식으로 실행 → 적절한 시점에 바이트코드 전체를 컴파일 (네이티브 코드로 변경) →  더 이상 인터프리팅 하지 않고 네이티브 코드로 직접 실행.
  • GC(Garbage Collector)를 수행하는 모듈 (쓰레드)이 있다.

 

3.3 Runtime Data Area

JVM이 운영체제 위에서 실행되면서 할당받는 메모리 영역. Class Loader에서 준비한 데이터들을 보관하는 저장소.

1) PC Register : Thread가 시작될 때 생성, 현재 수행 중인 JVM 명령의 주소를 갖고 있음.

2) JVM 스택 영역 : 지역 변수, 파라미터 등이 생성되는 영역. 실제 객체는 Heap에 할당되고 해당 레퍼런스만 Stack에 저장됨.

3) Native method stack : 다른 언어(C/C++등)의 메소드 호출을 위해 할당되는 구역 언어에 맞게 Stack이 형성되는 구역.

4) Heap Area : : new 명령어로 생성된 인스턴스와 객체가 저장되는 구역, 런타임 시 동적으로 할당하여 사용하는 영역이다. 모든 Thread가 공유한다.

  • Garbage Collection 이슈는 이 영역에서 일어난다.

5) Method Area (= Class area = Static area) : 클래스 정보를 처음 메모리 공간에 올릴 때 **초기화되는 대상(**멤버 변수(필드), 클래스 변수(Static 변수), 생성자와 메소드)을 저장하기 위한 메모리 공간.

  • Runtime Constant Pool : 상수 자료형을 저장하여 참조하고 중복을 막는 역할을 수행

 

4. 자바 프로그램 실행 과정

  1. 프로그램이 실행되면 JVM은 OS로부터 프로그램이 필요로하는 메모리를 할당받는다. JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.
  2. 자바 컴파일러 javac가 자바 소스 코드를 읽어들여 자바 바이트 코드 .class로 변환시킨다.
  3. Class Loader를 통해 class 파일들을 JVM으로 로딩한다.
  4. 로딩된 class 파일들은 Execution Engine을 통해 해석된다.
  5. 해석된 바이트코드는 Runtime Data Area에 배치되어 실질적인 수행이 이루어지게 된다. 이 실행과정 속에서 JVM은 필요에 따라 Thread Synchronization과 GC같은 관리 작업을 수행한다.

 

참고 링크

https://preamtree.tistory.com/2

https://asfirstalways.tistory.com/158

'프로그래밍 공부 > Java' 카테고리의 다른 글

[Java] Stream API  (1) 2022.03.03
[OOP] 객체지향 프로그래밍  (0) 2022.03.02
[Regex] 정규식이란?  (2) 2022.02.21
[JUnit5] 테스트 기초 알아보기  (0) 2022.02.17