출처
제목: "JVM ( JVM, Heap 구조 )"
작성자: velog(junny8643)
작성자 수정일: 2022년8월7일
링크: https://velog.io/@junny8643/JVM
작성일: 2022년8월13일
JVM 이란?
- Java Virtual Machine의 약자로써 JAVA 파일을 실행하는 일종의 소프트웨어이다.
- Java를 독자적인 프로세스로 실행하는 Runtime Instance(데몬) 이다
JAVA에서 프로그램을 실행한다는 것은
- 사용자가 작성한 Java Source File(.java)을
- 자바 컴파일러가 컴파일하여(Java Compiler -> javac.exe)
- Java Byte Code(.class)를 생성한다.
- 생성된 바이트 코드는 Class Loader에 로딩되어
- Execution Engine을 통해서 해석하고
- Runtime Data Areas에 배치되어 실직적인 실행이 이루어진다.
Runtime Data Area 구조
Method Area
- Class, 변수 , Method, Static 변수 , 상수 정보 등이 저장되는 영역이다.
Heap Area
- new로 생성된 인스턴스와 객체가 저장되는 영역이다.
Stack Area
- Method의 값들이 저장되는 영역이다.(생명주기는 LIFO)
PC Register
Native Method Stack
Heap Area
- Array와 Object 두가지 종류만 저장되는 곳이며, 모든 Thread에 의해 공유되는 영역이다.
- 흔히 서로 다른 쓰레드 사이에서 Heap Data를 이용할 때 동시성 문제가 발생한다
Heap Structure
- Hotspot JVM의 Heap 구조
- Young generation 과 Old generation 으로 이루어져 있다.
Hotspot JVM 참고: https://velog.io/@aki/HotSpot-JVM
Young generation
Old generation
- Young Generation에서 살아남은(특정 회수 이상 참조 된) Object가 이동 되는 영역이다.
- 앞으로 사용될 확률이 높은 Object들을 저장하는 영역이며, 이 영역에 메모리도 충분하지 않으면 GC가 발생한다 (Full GC)
Permanent
- Class, Method, Static 등이 저장되는 공간 ( 메타데이터 영역 )
- JAVA 8 부터는 Perm은 Metaspace 로 전환 되었다. ( Heap이 아닌 Native 영역 )
- JAVA 8 부터는 Perm의 상환값의 제한이 없기 때문에 Metaspace의 영역을 지정해서 메모리 누수를 지정해 줘야 할 때도 있다.