JVM 메모리 구조
자바 가상 머신(JVM, Java Virtual Machime)이란 자바 바이트 코드를 실행시키기 위한 가상의 기계이다. 자바로 작성된 모든 프로그램은 자바 가상 머신에서만 실행될 수 있기 때문에 자바 가상 머신이 설치되어 있어야 한다.
- Class Loader
- 클래스 파일들을 엮어서 JVM이 운영체제로부터 할당받은 메모리영역인 Runtime Data Area로 적재하는 역할
- Execution Engine
- Class Loader에 의해 메모리에 적재된 클래스들을 기계어로 변경해 명령어 단위로 실행하는 역할
- 두가지 방식이 있음
- 인터프리터(Interpreter): 명령어를 하나씩 실행
- JIT(Just-In-Time) 컴파일러: 적절한 시간에 전체 바이트 코드를 네이티브 코드로 변경해서 Execution Engine이 네이티브로 컴파일 된 코도를 실행하는 것으로 성능을 높이는 방식
- Garbage Collector
- Heap 메모리 영역에 생성(적재)된 객체들 중에 참조되지 않는 객체들을 탐색 후 재사용하는 역할
- Garbage Collector가 수행되는 동안 Garbage Collector를 수행하는 쓰레드가 아닌 모든 쓰레드가 일시 정지 됨
- Full Garbage Collector가 일어나서 수 초간 모든 쓰레드가 정지한다면 장애로 이어질 수 있음
- Runtime Data Area
- JVM 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적제하는 영역
- Method Area
- 클래스 멤버 변수의 이름, 데이터 타입, 접근 제어자 정보 등 static 변수, final class 변수등이 저장되는 영역
- Heap Area
- new 키워드로 생성된 객체와 배열이 생성되는 영역
- 메소드 영역에 로드된 클래스만 생성이 가능하고 Garbage Collector가 참조되지 않는 메모리를 확인하고 제거하는 영역
- Stack Area
- 지역 변수와 매개변수가 저장되는 영역
- Person p = new Person(); 이라는 소스를 작성했을 때, Person p는 스택영역에 생성되고 new로 생성된 Person 클래스의 인스턴스는 힙 영역에 생성
- 스택영역에 생성된 p의 값으로 힙 영역의 주소값을 가지고 있음
- PC Register
- Thread가 생성될 때마다 생성되는 영역으로 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역
- CPU의 레지스터와 다름
- Native Method Stack
- 자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역
- C/C++ 등의 코드를 수행하기 위한 스택 (JNI)
https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_%EA%B0%80%EC%83%81_%EB%A8%B8%EC%8B%A0
'Java' 카테고리의 다른 글
ZipOutputStream vs ZipArchiveOutputStream (2) | 2024.11.08 |
---|---|
FileInputStream vs BufferedInputStream (0) | 2024.11.03 |
JDK Dynamic Proxy와 CGLIB (0) | 2024.07.30 |
Java Collections Framework (0) | 2020.03.25 |
(Java) 객체지향 프로그래밍 (0) | 2020.03.18 |