Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- method area
- backend
- 웹캐시
- B+TREE
- Ehcache
- 지연로딩
- Spring Data Redis
- Metaspace
- java
- nonclustered index
- Jenkins
- ci/cd
- JDK14
- 리팩터링
- CaffeineCache
- springboot
- JPA
- 상태패턴
- JAVA8
- 공변
- 부하테스트
- 트랜잭션
- 제네릭
- GithubActions
- 재고 시스템
- lazyloading
- 카카오 화재
- Redis
- 주문
- 동시성
Archives
- Today
- Total
NDM
[Java] 자바 동작 원리와 JVM 2편 : Runtime Data Area 본문
목차
- Runtime Data Area
- Prior Java 8
- After Java 8
Runtime Data Area
- 프로그램 수행을 위해 할당받은 공간. 자바 메모리 공간이라고도 불림
Method Area ( Java 8 이전 )
- Non-Heap 공간. Permanent를 차지하는 공간으로, Method Area, Static Area 등으로 불림
- 모든 Thread에 의해 공유되는 공간
- 클래스와 인터페이스, Runtime Constant Pool, 멤버 변수, 클래스 변수, 생성자와 메소드의
메타데이터를 저장하는 공간 - 이 공간의 메타데이터를 이용하여 물리적인 메모리를 참조하게 됨
- 클래스 파일의 바이트코드가 로드되는 공간
- Permanent Generation
-
- 클래스 정의, 구조, 필드, 메소드, 상수로부터 클래스 관련 데이터를 저장
- MaxPermSize를 사용하여 규제 가능
- 이 공간이 부족할 경우 OOM(Out Of Memory)이 발생
- Code Cache
-
- 컴파일 된 코드를 저장하는데 사용
- HotSpot JVM의 JIT 컴파일러에 의해 처리되는 공간
Method Area ( Java 8 이후 )
- Permaent Generation 영역이 사라지고 MetaSpace로 통합
- JVM의 관리 -> OS의 직접적인 관리를 받게 됨
- 기존의 JVM에서 관리되던 PermGen은 제한이 있었지만 OS에서 관리되며 제약이 사라짐
- Permanent Generation에서 관리되던 기존의 데이터들
- Class / Interface 메타데이터
- Method / Variable 메타데이터
- JVM, JIT 관련 데이터
- Static Object , 변수, 상수 -> Heap에서 관리되도록 바뀜 -> Static도 GC의 대상이 됨
Stack Area
- 메소드 호출 시마다 각각의 스택 프레임이 생성
- 메서드 안에서 사용되는 데이터가 저장됨. (지역변수, 매개변수, 파라미터, 리턴값(임시값) 등)
- 라이프 사이클 : 메소드 호출시부터 종료시까지
- 각각의 Thread마다 별도로 사용. 공유되지 않음
PC Register
- 현재 수행중인 JVM의 명령어 주소를 갖는 공간
- 각각의 Thread 마다 별도 생성
- Thread가 어떤 부분을 어떤 명령어로 실행할지에 대한 기록 저장
Native Area
- JNI(Java Native Interface)를 통해 호출되는 C/C++ 등의 코드를 수행하기 위한 스택
- 네이티브 메소드의 매개변수, 지역변수 등을 바이트코드로 저장
- 자바 언어 외의 메서드들이 저장되는 공간
- 각각의 Thread마다 별도 생성
Heap Area
- 모든 쓰레드가 공유하는 공간
- new 키워드로 생성된 객체와 배열이 생성되는 영역입니다.
- 메소드 영역에 로드된 클래스만 생성이 가능하고 Garbage Collector가 참조되지 않는 메모리를 확인하고 제거하는 공간
- Eden
- 새로 생성된 대부분의 객체 인스턴스가 처음 위치하는 영역
- GC에 의해 제거되고, 살아남은 객체들은 Survivor1 / Survivor2 둘 중 하나로 이동
- Survivor
- 1,2 둘 중 하나의 영역이 꽉 차게 되면 살아남은 객체는 비워진 또다른 Survivor로 이동
- 참조가 없는 객체들은 역시 GC에 의해 제거됨
- MinorGC : Eden / Survivor 영역 등 Young 영역에서 발생하는 GC
- Old
- Survivor을 왔다갔다 하다가 끝까지 살아남은 객체들이 이동하는 공간
- Old는 보통 Young보다 크게 할당하며, GC의 발생 빈도는 Young보다 적음
- MajorGC : Old, Permanent 영역에서 발생하는 GC
'Java' 카테고리의 다른 글
[Java] Java Exception과 Spring Transaction (0) | 2022.08.06 |
---|---|
[Java] Java8 MetaSpace (0) | 2022.08.05 |
[Java] Java Generic은 어떻게 동작할까? (0) | 2022.05.09 |
[Java] GC와 Java Reference Type 1편 : Java Reference Type (0) | 2022.05.01 |
[Java] 자바 동작 원리와 JVM 1편 : Class Loader (0) | 2022.04.28 |