JVM
01 Jul 2019자바코드가 실행되는 과정
- Java Source : 사용자가 작성한 Java 코드(.java)
- Java Compiler : Java Source 파일을 JVM이 해석할 수 있는 Java Byte Code로 변경한다.
- Java Byte Code : Java Compiler에 의해 컴파일된 결과물이다.(.class)
- Class Loader : JVM 내로 .class 파일들을 로드하여 Runtime Data Areas에 배치한다.
- Execution Engine : 로드된 클래스의 Bytecode를 해석(Interpret)한다.
- Runtime Data Area : JVM이라는 프로세스가 프로그램을 수행하기 위해 OS에서 할당 받은 메모리 공간이다.
Runtime Data Area의 메모리 구조
- Method Area : 클래스 멤버 변수의 이름, 데이터 타입, 접근 제어자 정보같은 필드 정보와 메소드의 이름, 리턴 타입, 파라미터, 접근 제어자 정보같은 메소드 정보, Type정보(Interface인지 class인지), Constant Pool(상수 풀 : 문자 상수, 타입, 필드, 객체 참조가 저장됨), static 변수, final class 변수등이 생성되는 영역이다.
- Heap Area : new 키워드로 생성된 객체와 배열이 생성되는 영역이다.
- 메소드 영역에 로드된 클래스만 생성이 가능하고 Garbage Collector가 참조되지 않는 메모리를 확인하고 제거하는 영역이다.
- Stack Area : 지역 변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값등이 생성되는 영역이다.
- PC Register : CPU의 Register와 역할이 비슷하다. 현재 수행 중인 JVM 명령의 주소값이 저장된다.(각 Thread별로 하나씩 생성된다.)
- Native Method Stack : 다른 언어(C/C++ 등)의 메소드 호출을 위해 할당되는 구역으로 언어에 맞게 Stack이 형성되는 구역이다.
Heap Area
- Java 1.8에서 JVM 메모리의 구조적인 개선 사항으로 Perm 영역이 Metaspace 영역으로 전환되고 기존 Perm 영역은 사라지게 되었다.
- Metaspace 영역은 Heap이 아닌 Native 메모리 영역으로 취급하게 된다.
- Native 메모리는 Heap과 달리 OS레벨에서 관리 하는 영역이다.
Heap Area와 GC
- Minor GC
- 새로 생성한 대부분의 객체는 Eden 영역에 위치한다.
- Eden 영역에서 GC가 한 번 발생한 후 살아남은 객체는 Survivor 영역 중 하나로 이동된다.
- Eden 영역에서 GC가 발생하면 이미 살아남은 객체가 존재하는 Survivor 영역으로 객체가 계속 쌓인다.
- 하나의 Survivor 영역이 가득 차게 되면 그 중에서 살아남은 객체를 다른 Survivor 영역으로 이동한다. 그리고 가득 찬 Survivor 영역은 아무 데이터도 없는 상태로 된다.
- 이 과정을 반복하다가 계속해서 살아남아 있는 객체는 Old 영역으로 이동하게 된다.
- Major GC(Full GC)
- Old Generation의 메모리도 충분하지 않으면 해당 영역에서 GC가 발생
JDK버전과 GC
- 확인할 수 있는 명령
java -XX:+PrintCommandLineFlags -version
- default GC
- ~8: parallelGC
- 9~: G1 GC