Runtime Data Area는 JVM이 프로그램을 수행하기 위해 운영체제로부터 할당 받는 메모리 영역입니다.
1. Method area
프로그램이 실행되면 모든 코드가 저장되어 있는 상태가 아닙니다. new 키워드를 통해 객체가 동적으로 생성되기 전에는 텍스트일 뿐입니다. 클래스 로더에 의해 로드된 클래스의 바이트코드와 메타데이터가 저장되는 곳이며 동적 메모리 관리 및 쓰레드 동기화와 같은 기능을 합니다.
- JVM당 하나 존재
- 모든 쓰레드가 공유하는 영역이므로 동시성 문제를 고려해야합니다.
- 해당 정보에 대한 요청이 오면 실제 물리 메모리주소로 변환해서 전달
- 인스턴스 생성을 위한 객체 구조, 생성자, 필드 저장
- 주로 영구적인 정보가 저장되는 영역이라 GC가 heap 영역보다 덜 시행됩니다.
주요 컴포넌트 정리
- 클래스 로더 정보
- 바이트 코드 - 클래스나 인터페이스 구현 바이트코드
- 런타임 상수 풀 - 클래스나 인터페이스의 모든 정적 변수의 참조를 포함. method area에 위치하지만 각 클래스, 인터페이스마다 별도의 런타임 상수 풀이 존재
- 필드와 메소드 데이터
- 메소드와 생성자 코드
- 정적 변수
2. Heap
Java 애플리케이션 런타임 데이터 영역으로, 객체와 JRE 클래스들의 인스턴스를 할당합니다. JVM당 하나 존재
주요 컴포넌트 정리
- 객체의 인스턴스
- 배열
- 인스턴스 변수
- String pool - 리터럴이 저장되는 특수한 영역
- wrapper 클래스 객체
- singleton, cached data
구조
1. Young generation
최초로 새로운 객체가 생성되었을 때, heap memory에 위치하는 공간입니다.
Eden - 자바 객체가 생성되자마자 할당되는 메모리 영역, new 연산자로 생성된 객체가 위치
Survivor - Eden에서 살아남은 객체들이 이동하는 곳, Minor GC 발생하고 살아남으면 old generation으로 이동
2. Old generation
young generation에서 GC로 마지막까지 살아남은 객체가 old generation으로 오게됩니다. Major GC 발생하며 이는 Stop-The-World(STW)를 수반합니다. STW는 모든 애플리케이션 스레드가 일시 중단되는 시간을 의미합니다.
3. Permanent Generation
JVM에 의해 사용되는 메타메이터와 클래스 정보가 저장되는 영역 (Java 8 이후에는 metasapce로 대체)
Q. 왜 나뉘어져 있는가?
A. GC 알고리즘의 효율을 높이기 위해, 객체의 생명주기 특성을 기반으로 heap을 여러 세대로 나누어 관리합니다.
3. JVM stack in Thread
Thread 별로 하나씩 존재하며, 해당 thread에서 Java 메소드 호출의 실행을 관리합니다. 이 스택은 "프레임"이라는 단위로 구성되어 있습니다. 각 프레임은 메소드의 지역변수, 중간 연산결과, 연산데이터, 리턴값등을 포함하며 stack 답게 LIFO 방식으로 관리합니다. 메소드 종료시 해당 프레임은 스택에서 pop 되고 메모리가 자동으로 반환됩니다.
Q. 보통 heap, stack, data 영역이 있는데 Java는 data영역이 없는것인가?
A. data 영역이 따로 존재하지 않지만 method area와, Runtime constant pool에서 처리됩니다.
4. PC Register in Thread
전통적인 cpu에서의 pc는 현재 실행중인 명령어의 주소를 가리킵니다. 하지만 JVM에서는 조금 다릅니다. 특정 스레드가 현재 실행중인 자바 바이트코드의 명령의 주소를 저장합니다.
5. Native method stack in Thread
JVM에서 자바 메소드가 아닌 네이티브 메소드를 위한 데이터를 저장하는 영역입니다. 네이티브 메소드란 자바가 아닌 다른언어로 작성된 메소드를 의미하며 대부분 c, c++ 코드를 의미합니다. 이 메소드들은 주로 Java Native Interface를 통해 호출됩니다. 이 native method stack을 활용하면 Java 애플리케이션과 다른 네이티브 애플리케이션 간의 상호작용을 가능해집니다.
Q. JNI는 무엇인가?
A. 자바, 네이티브 애플리케이션 사이에서 상호작용을 가능케하는 프로그래밍 프레임워크입니다.
Q. 네이티브 애플리케이션을 활용하는 예시로는 어떤것들이 있을까?
A. 어떤 특수한 알고리즘을 구현한 C++ 라이브러리가 있고, 이를 자바 웹 애플리케이션에서 사용하고 싶을 때, 복잡한 수학적 계산이나 이미지 처리 작업을 네이티브 코드로 구현하여 성능을 향상시킬 수 있습니다.
# References
https://velog.io/@sgwon1996/JAVA%EC%9D%98-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC%EC%99%80-JVM-%EA%B5%AC%EC%A1%B0
https://www.holaxprogramming.com/2013/07/16/java-jvm-runtime-data-area/
https://hsunnystory.tistory.com/103
https://tecoble.techcourse.co.kr/post/2021-08-09-jvm-memory/
https://kotlinworld.com/3
https://minhyeokism.tistory.com/27
chatgpt
'Back-end' 카테고리의 다른 글
Github actions pull_request_target (0) | 2024.01.10 |
---|---|
[JVM 동작원리] 3. Execution engine (0) | 2023.10.16 |
[JVM의 동작원리] 1. 클래스 로더 (0) | 2023.10.10 |
Java의 compile 과정 (0) | 2023.10.09 |
agile 방법론, microservice, dev-ops, cloud (0) | 2023.07.15 |