1편 : https://developer-youn.tistory.com/124
2편 : https://developer-youn.tistory.com/125
4편 : https://developer-youn.tistory.com/127
0. 들어가며
앞서 클래스 로더까지 공부하며. class파일에 있는 바이트 코드를 읽는 과정을 살펴보았다. 이제 런타임 중에 데이터들이 어디에 무엇이 저장되는지 알아보자.
우선 필자는 jdk8 기준으로 진행한다.
1. Runtime Data Areas
전체적으로는 이런 구조를 가지고 있다.
2. Thread
하나의 Thread안에는 PC Register, JMV Stack, Native Method Stack영역이 존재한다. 각각에 대해 살펴보자.
2-1. PC Register
program counter를 가지고 있는 공간이다. program counter라고 하니까 뭔가 좀 어려워보이겠지만 프로그램을 실행하기 위한 실행 명령어 주소를 가지고 있는 공간이라고 생각하면 된다.
저장되는 순서는 다음과 같다.
- Thread가 생성된다
- Thread안에 pc register영역이 할당된다.
- 메서드가 수행됨에 따라 해당 명령어가 저장된다.
2-2. JVM Stack
로컬 변수, 메서드 콜백, 메서드 리턴 결과 등등 저장한다.
2-3. Native Method Stack
이름 그대로 native로 작성된 메서드를 호출하기 위해 만들어진 영역이다.
대표적인 예시는 C라이브러리(DLL)를 JNI로 호출하는 것이다.
3. Heap
이제 진짜 많이 들어본 그놈의 heap 뭔지 좀 봐보자.
맨날 터졌다는 그 힙(Heap) 도대체 뭘까
우선 크게 3가지 개념으로 잡고 가면 된다.
- new 키워드를 생성해 만든 객체 저장
- string constant pool 포함
- GC의 대상이 되는 영역
GC의 대상이 되는 영역이라고 했는데 앞에서 JNI로 호출하면 어떻게 되는 것인가?
- 여러분의 의심대로 Native method stack은 GC대상이 아니다.
- GC에 도달하게 하는 방법은 있으나 그냥 사용하면 C++내에서 메모리 해제를 해줘야 한다.
4. Method Area
최대한 쉽게 말하면
heap이랑 native method stack에 저장되는 정보 제외하면 다 저장된다고 생각하면 된다.
5. Runtime Constant pool
앞에서 constant pool을 언급한 적이 있다. 그거랑 똑같다고 보면 된다. 다시 복기해 보자.
constant pool : . class 파일에서의 constant pool은 리터럴 상수를 저장하며 Class와 Method에 대한 참조 값 또한 포함한다.
runtime constant pool : 실행 중 발생하는 리터럴 상수를 저장하며 Class와 Method에 대한 참조 값 또한 포함한다.
6. 마치며
뭔가 빈약하게 설명을 한 것 같다면 여기 적힌 키워드를 토대로 과거 jvm과 최신 jvm을 가볍게 보는 것도 좋다고 생각한다.
contact: dev.berno@gmail.com
'JAVA > java - core' 카테고리의 다른 글
throw에 대한 간단한 설명과 개인적인 생각 (0) | 2023.02.26 |
---|---|
jvm 조금씩 알아가기 4편 - 실행 엔진(Execution Engine) (0) | 2023.02.22 |
jvm 조금씩 알아가기 2편 - 클래스 로더(class loader) (0) | 2023.02.18 |
jvm 조금씩 알아가기 1편 - jvm이란 (0) | 2023.02.17 |