Skip to main content

JVM

· 3 min read

1

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

2

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 튜닝

3