JVM(Java Virtual Machine) - 2

ymk·2023년 5월 18일
0
post-thumbnail

Java 프로그램의 실행 단계

저번에는 JVM의 정의를 알아보았다. 이번에는 JVM의 메모리 구조를 더 자세하게 알아보려고 한다. 자바 프로그램의 실행 단계를 크게 보면 다음과 같이 된다.

자바 소스 파일(.java)는 먼저 자바 컴파일러를 통해 바이트 코드로 변환된다(.class). 자바 컴파일은 윈도우의 CMD나 맥 OS의 Terminal을 통해서 직접해 볼 수 있다.
그 후 java test 명령어를 통해 컴파일된 프로그램을 실행시킬 수 있다. 이때 test.class 파일을 찾고 해당 class 내부에서 main이라는 이름을 가진 method를 찾아 main 내부의 코드를 실행한다.

여기서 JVM은 Class Loader를 통해 클래스 파일을 Runtime Data Area로 읽어들이며 실행되는 것이다.

JVM 메모리 구조


1. Class Loader
위에서 언급했듯이 JVM Runtime Data Area의 Method Area로 클래스 파일을 동적으로 로드하고 링크를 통해 배치하는 작업을 수행하는 모듈이다.

2. Execution Engine
Method Area에 배치된 .class 파일(바이트 코드)들은 JVM에 의해 실행 엔진(Execution Engine)에 제공되고 정의된 내용대로 바이트 코드를 실행된다. 이때 로드된 바이트코드를 실행하는 런타임 모듈이 바로 실행 엔진(Execution Engine)이다. Execution Engine은 바이트코드를 명령어 단위로 읽어서 실행한다.

3.Garbage Collector
Garbage Collector(GC)는 힙 메모리 영역에 생성된 객체들 중에서 참조되지 않은 객체들을 탐색 후 제거한다. 따라서 개발자는 따로 메모리를 관리하지 않고 여기에 신경쓰지 않아도 된다.

Runtime Data Area

Runtime Data Area는 먼저 크게 5가지 영역으로 나누어져 있다.
Method Area, Heap Area 는 모든 Thread가 공유한다. 나머지 Stack Area, PC Register, Native Method Stack 는 Thread마다 하나씩 생성되는 공간이다.

1. Method Area
클래스 정보, 변수 정보, static으로 선언한 변수가 저장되고 모든 Thread가 공유하는 영역이다.

2. Heap Area
동적으로 (new) 생성된 객체와 배열이 생성되는 영역이며 GC의 대상이 되는 공간이다.
이런 Heap Area는 효율적인 GC 수행하기를 위해 크게 3가지의 영역으로 나뉘어져 있다.

Young Generation 영역은 자바 객체가 생성되자마자 저장되며, 생긴지 얼마 안된 객체가 저장되는 공간이다. Heap 영역에 객체가 생성되면 최초로 Eden 영역에 할당되는데, 이 영역에 어느정도 데이터가 쌓이게 되면 참조 정도에 따라 Servivor의 빈 공간으로 이동되거나 회수된다. Young Generation 영역에 대한 가비지 컬렉션을 Minor GC라고 부른다.

Young Generation 영역이 차게 되면 다시 참조 정도에 따라 Old 영역으로 이동되거나 회수된다. Old Generation 영역에 대한 GC는 Major GC 라고 한다. Old 영역에 할당된 메모리가 모두 차게 되면, Old 영역에 있는 모든 객체들을 검사하여 참조되지 않은 객체들을 한번에 삭제하는 GC가 실행된다. 이 작업은 시간이 오래 걸리기 때문에 GC를 실행하는 Thread를 제외한 모든 Thread는 작업을 중단하게 된다. 이것을 "Stop-the-World"라고 한다.

3. Stack Area
지역변수나 메서드의 매개변수, 임시적으로 사용되는 변수, 메서드의 정보가 저장되는 영역이다.

4. PC Register
Thread가 시작될 때 생성되며, 현재 수행중인 JVM의 명려어 주소를 저장하는 영역이다. 즉 Thread가 어떤 부분을 어떤 명령어로 수행할지를 저장하는 공간이다.

5. Native Method Stack
Java가 아닌 다른 언어로 작성된 코드를 위한 영역이다. 즉 JNI(Java Native Interface)를 통해 호출하는 C/C++등의 코드를 수행하기 위한 영역이다.

profile
개발 공부 일지

0개의 댓글