JVM 메모리 구조와 라이프 사이클
JVM (Java Virtual Machtine)
- JAVA와 OS 사이에서 중개자 역할
- OS에 구애 받지 않고 프로그램을 실행하도록 도와준다.
- 가비지 컬렉터를 통해 자동으로 메모리 관리
- 스택VM 기반으로 동작
JVM 메모리 구조
1) Class Loader
- JVM 내로 클래스 파일을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈
- 런타임 시에 동적으로 클래스를 로드한다.
2) Execution Engine
- 클래스 로더를 통해 JVM 내의 Runtime Data Area에 배치된 바이트 코드들을 명령어 단위로 읽어서 실행한다.
3) Garbage Collector
- 힙 메모리 영역에 생성된 객체들 중에서 참조되지 않은 객체를 탐색 후 제거하는 역할
- GC가 역할을 하는 시간은 언제 인지 정확히 알 수는 없음
4) Runtime Data Area
- JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역
- Method area
- 모든 쓰레드가 공유하는 메모리 영역. 클래스, 인터페이스, 메소드, 필드, Static변수 등의 바이트 코드를 보관한다.
- PermGen / Metaspace
- 클래스의 메타 데이터가 저장되는 영역(클래스 이름, 생성정보, 필드정보, 메서드 정보)
- JDK 1.7 이하에서는 PermGen이 매우 작은 크기의 고정 메모리로 할당 되어있어서 OOM이 종종 일어났으나 JDK 1.8부턴 Metaspace로 이름이 변경되고 동적 메모리로 할당 되어있다.
- Heap area
- 모든 쓰레드가 공유하며 new 키워드로 생성된 객체와 배열이 보관되는 영역
- 메소드 영역에 로드된 클래스만 생성이 가능
- GC가 참조되지 않은 메모리를 확인하고 제거하는 영역
- Stack area
- 메서드 호출 시마다 그 메서드만을 위한 공간(스택 프레임)을 생성한다.
- 메서드 안에서 사용되는 값들을 저장하고, 호출된 메서드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값 드을 저장한다.
- 메서드 수행이 끝나면 프레임별로 삭제된다.
- PC Register
- 쓰레드가 시작될 때 생성되며, 쓰레드마다 공간이 하나씩 존재한다.
- 쓰레드가 어떤 부분에 무슨 명령으로 실행할지에 대한 기록을 하는 부분.
- 현재 수행중인 JVM명령의 주소를 갖는다.
- Native method stack
- 자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역
'Back-End > Java & Spring' 카테고리의 다른 글
[JAVA] JNDI( Java Naming and Directory Interface ) (0) | 2022.08.02 |
---|---|
[JAVA] Apach Axiom API (XML Parser) (0) | 2022.08.02 |
[JAVA] Java Framework 종류 (0) | 2022.08.02 |
[JAVA] Collection Framework 정의/성능 비교 (0) | 2022.08.02 |
[JAVA] 문자열 String (0) | 2022.08.02 |