Java Source : 사용자가 작성한 Java 코드
Java Compiler : Java Source 파일을 JVM이 해석할 수 있는 Java Byte Code로 변경
Java Byte Code : Java Compiler에 의해 수행될 결과물 (.class 파일)
Execution Engine : Loading 된 클래스의 Bytecode를 해석
Runtime Data Area: : JVM이라는 프로세스가 프로그램을 수행하기 위해 OS에서 할당 받은 메모리 공간
Method Area: 클래스, 변수, Method, static 변수, 상수 정보 등이 저장되는 영역
Heap Area: new 명령어로 생성된 인스턴스와 객체가 저장되는 구역 (GC는 이 영역에서 수행. 모든 Thead 공유)
Stack Area: Method 내에서 사용되는 값들 (매개변수,지역변수,리턴값 등) 이 저장되는 구역. 메소드 호출될 때 LIFO로 하나씩 생성. 메소드 실행이 완료되면 LIFO로 하나씩 지워짐 (각 Thread별로 하나씩 생성)
Pc Register: CPU의 레지스터와 역할이 비슷. 현재 수행 중인 JVM 명령의 주소 값이 저장
Native Method Stack: 다른 언어(C/C++ 등)의 메소드 호출을 위해 할당되는 구역으로 언어에 맞게 Stack이 형성
Java Heap
Hotspot JVM

GC
명시적인 메모리 해제보다 느림 GC 순간 발생하는 Suspend Time으로 인해 다양한 문제 야기
Root Set의 광의적 개념으로서
Root Set에서 어떤 식으로든 Reference 관계가 있으면 Reaable Object라고 하며 이를 현재 사용되는 Object로 판단
Local variable Section, Operand Stack에 Object의 Reference 정보가 있다면 Reachable Object 이다
Methoad Aread에 로딩된 클래스 중 contant pool에 있는 Refence 정보를 토대로 Thread에서 직접 참조하진 않지만 constant pool을 통해 간접 link를 하고 있는 Object는 Reachable Object이다.
아직 Memory에 남아 있으며 Native Method Area로 넘겨진 Object는 Reachable Object이다.
GC Fragment
메모리 Compaction
GC 튜닝
