728x90
JVM 정의
- 자바 가상머신, 자바 바이트 코드를 실행하는 주체, 어떠한 운영체제에서 독립적으로 실행 가능
- 자바 바이트 코드를 인터프리터와 JIT컴파일러를 통해 변환하여 실행함
JRE 정의
- 자바 애플리케이션을 실행할 수 있도록 구성된 배포판
- JVM과 핵심 라이브러리 및 자바 런타임 환경에서 사용하는 프로퍼티 세팅이나 리소스파일을 가지고 있음
JDK 정의
- JRE + 개발에 필요한 툴
- 오라클은 자바 11부터 JRE를 따로 제공하지 않고 JDK만 제공함
JVM 구성
- Class Loader
- Execution Engine
- Garbage Collector
- Runtime Data Area
Class Loader
- 자바파일을 컴파일하면 클래스파일(바이트 코드)이 생성되고, 클래스 파일들을 엮어 Runtime Data Area로 메모리에 적재함
- 로딩 : 클래스를 읽어오는 과정
- 링크 : 레퍼런스를 연결하는 과정
- 초기화 : static 값들 초기화 및 변수 저장
Execution Engine
- 적재된 클래스 파일들을 기계어로 변경하여 명령어 단위로 실행함
- 인터프리터 : 바이트 코드 한줄 실행
- JIT 컴파일러 : 인터프리터의 효율을 높히기 위해 인터프리터가 반복되는 코드를 모두 네이티이브 코드로 바꿔놓으며 그다음부터 인터프리터는 네이티브 코드로 컴파일된 코드를 사용함
- Gabarge Collector (아래 내용 참고)
Garbage Collector
정의
- Heap 메모리 영역에서 생성된 객체들 중에서 참조되지 않는 객체(Unreachable object)들을 회수함
- GC의 동작시간은 일정하게 정해져 있지 않기 때무에 언제 객체를 정리할지는 알 수 없음
- GC를 수행하는 동안 GC Thread를 제외한 다른 모든 Thread는 일시정지상태가 됨 (Full GC가 일어나는 순간 수초간 모든 Thread가 정지한다면 심각한 장애로 이어질 수 있음)
- GC과정을 Mark and Sweep 이라고함 GC가 스택의 모든 변수 또는 Reachable 객체를 스캔하면서 각각 어떤 객체를 참조하고 있는지 찾는 과정이 Mark 이 과정에서 Stop the world가 발생하며 이후 Mark 되어있지 않은 객체들을 힙에서 제거하는 과정이 Sweep
MinorGC / Major GC
- Heap 구성은 Young, Old, Perm 세가지로 나뉘는데, Young 영역에서 발생한 GC를 Minor GC, 나머지 두 영역에서 발생한것은 Major GC (Full GC)
Young영역 / Old영역
- Young 영역은 3개의 영역으로 나뉨 (Eden영역, Survivor 영역 2개)
- Eden 영역에 최초로 객체가 만들어지고, Survivor 영역을 통해서 Old 영역으로 오래 살아남은 객체가 이동
- Old 영역은 기본적으로 데이터가 가득 차면 GC를 실행 GC 방식에 따라서 처리 절차가 달라짐 (GC 종류 글참고 : https://tgyun615.com/29?category=908821)
Runtime Data Area
- JVM의 메모리 영역으로 자바 애플리케이션 실행시 사용되는 데이터를 적재하는 영역
- 크게 5가지 영역으로 구성되어 있음 (Stack, Heap, Method, PC Register, Native Method Stack)
Method
- JVM이 읽어들인 클래스와 인터페이스 대한 런타임 상수 풀, 멤버 변수(필드), 클래스 변수(static 변수), 생성자와 메소드를 저장하는 공간
Heap
- JVM이 관리하는 프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당하여 사용하는 영역
- New 연산자로 생성된 객체 또는 객체(인스턴스)와 배열을 저장
- 힙 영역에 생성된 객체와 배열은 스택 영역의 변수나 다른 객체의 필드에서 참조
Stack
- 지역변수, 파라미터, 리턴 값, 연산에 사용되는 임시값 등을 저장
- 메소드 호출시 개별적으로 스택이 생성 (스택 프레임이 생성되며 쓰레드 종료하면 런타임 스택이 사라짐)
PC Register
- 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역
- 쓰레드마다 쓰레드내 현재 실행할 스택 프레임을 가리키는 포인터를 생성
Native Method Stack
- 자바외 언어로 작성된 네이티브 코드를 위한 메모리 영역
'JAVA' 카테고리의 다른 글
[JAVA] 예외(Exception) (0) | 2021.06.07 |
---|---|
[JAVA] 싱글턴 패턴 (0) | 2021.06.05 |
[JAVA] Enum (0) | 2021.06.02 |
[JAVA] GC의 종류 (0) | 2021.05.23 |
[JAVA] 상태패턴 (0) | 2021.05.21 |