1. JVM 구조

* Class Loader System

자바를 사용해 코드를 작성하면 [name].java라는 파일이 생긴다. 그 파일을 자바컴파일러가 컴파일을 하고 나면 [name].class 파일을 생성한다.(바이트코드) 이처럼 생겨난 .class파일들을 JVM이 OS로부터 할당받은 Run-time Data Area로 적재하는 역할 수행.(java application이 실행 중 일 때 수행)

* Execution Engine

Class Loader System에 의해 메모리에 적재된 .class들을 기계어로 변경, 명령어 단위로 실행하는 역할.

 - 명령어를 하나씩 실행하는 Interpreter 방식이 있고, JIT(Just-In Time) 컴파일러를 사용하는 방식이 있다. JIT는 적절한 시간에 전체 바이트코드를 네이티브코드로 변경해서 Execution Engine이 컴파일 된 코드를 실행하는 것으로, 성능을 더 높일 수 있는 방식이다.

* Garbage Collector

Heap 메모리 영역에 적재된 객체들 중에 참조되지 않은 객체들을 탐색 후 제거하는 역할.

 - System.gc(), close() 등 코드를 사용하여 GC(Garbage Collection)을 수행할 수는 있으나 이는 객체를 사용하지 않는다는 의미일 뿐 실제 메모리의 해제는 Garbage Collector에 의해서만 가능하다.

 - Garbage Collector가 동작하는 시간을 정확히 알 수는 없다.

 - GC를 수행하는 동안 GC를 수행하는 thread가 아닌 다른 thread는 일시정지 된다.(Stop the world)

* Run-time Data Area

JVM의 메모리 영역으로 Java Application을 실행할 때 사용되는 데이터들을 적재하는 영역.

* Method Area(전체 Thread 공유)

클래스 멤머 변수의 이름, 데이터 타입, 접근 제어자 정보같은 필드 정보와 메소드의 이름, 리던 타입, 파라미터, 접근 제어자 정보같은 메소드 정보, 타입 정보(Interface 인지 class 인지), Constant Pool(문자 상수, 타입, 필드, 객체 참조 등), static 변수, final class 변수 등이 생성되는 영역...

* Heap(전체 Thread 공유)

new 키워드를 통해 생성된 객체와 배열이 적재되는 영역.Method Area에 로드 된 클래스만 적재가 가능하고, Garbage Collector가 참조되지 않은 메모리를 확인하고 제거하는 영역.

* Java stacks(각 Thread 별로 생성)

지역변수, 파라미터, 리턴 값, 연산에 사용되는 임시값 등이 적재되는 영역.

Test class를 선언했다고 치자. Test t = new Test(). 이 때, 주소를 가리키고 있는 t는 Java stack에 적재되고, new를 통해 생성된 Test 클래스(객체)는 Heap에 적재 되는 것이다.

* PC Registers(각 Thread 별로 생성)

Thread가 생성될 때 마다 생성되는 영역. PC는 Program Counter의 줄임말이다. 현재 Thread가 실행되는 부분의 주소와 명령을 저장하고 있다.(CPU 의 PC Register와는 다르다)

* Native Method Stacks(각 Thread 별로 생성)

Java이 외의 언어로 작성된 네이티브 코드를 위한 메모리 영역.

보통 C/C++의 코드를 수행하기 위한 스택이다.(JNI)

 

Heap과 Garbage Collector의 경우 Hotspot, IBM의 java에 따라 구조가 조금 다르고 버전에 따라 변경사항이 있기 때문에 주의가 필요하기 때문에 추가로 알아보도록 하자.