JVM 구동방식
(0) 컴파일러에 .java -> .class 컴파일
(1) 클래스 로더에 의해서 클래스 파일을 메모리 영역에 로드 후 초기화 작업 수행
(2) 메모리 영역에 Static(Method)부터 로드가 됩니다
( 클래스 로드가 끝난 후 JVM은 main 메소드를 찾아 지역변수, 객체변수, 참조변수를 스택에 쌓음 )
(4) 로드 후에 JVM이 힙 영역에 객체를 생성합니다
(5) 마지막으로 실행엔진이 .class 파일(바이트코드)을 다양한 메모리를 참조하여 한줄씩 상황에 맞는 작업 수행(함수 호출, 객체 할당 등)
- Class Loader: JVM내로 클래스를 로드하고 링크를 통해 배치하는 작업을 수행하는 모듈로써 런타임시 동적으로 클래스를 로드한다.
- Execution Engine: Class Loader를 통해 JVM 내의 런타임 데이터 영역에 배치된 바이트 코드를 실행한다. 이 때, Execution Engine은 자바 바이트 코드를 명령어 단위로 읽어서 실행한다.
- Garbage Collector: JVM은 Garbage Collector를 통해 메모리 관리 기능을 자동으로 수행한다. 애플리케이션이 생성한 객체의 생존 여부를 판단하여 더 이상 사용되지 않는 객체를 해제하는 방식으로 메모리를 자동 관리한다.
- Runtime Data Areas: JVM이 운영체제 위에서 실행되면서 할당받는 메모리 영역이다. Class Loader에서 준비한 데이터들을 보관하는 저장소이다.
Runtime Data Areas
Runtime Data Areas는 Process로서의 JVM 프로그램을 수행하기 위해
OS로 부터 할당 받는 메모리 영역으로
각각의 목적에 따라 5개의 영역으로 나뉜다.
JVM 메모리구조
1. 메소드영역 : 메소드의 바이트코드 , 클래스변수가 저장되는 영역
2. 힙 영역 : 프로그램 실행 중 생성된 객체가 저장되는 영역
3. 스텍 영역 : 메소드 내의 지역변수 , 매개변수(참조형 제외)가 저장되는 영역
4. pc 레지스터 : jvm이 현재 수행할 명령어의 주소가 저장되는 영역
5. Native메소드 스텍 : JAVA어 외의 다른 언어의 메소드에 매개변수 , 지역변수가 저장되는 영역
메소드 영역/런타임 상수 풀의 사용기간 및 스레드 공유 범위
- JVM 시작시 생성
- 프로그램 종료 시까지
- 명시적으로 null 선언 시
- 구성 방식이나 GC 방법은 JVM 벤더마다 다를 수 있다.
- 모든 스레드에서 공유한다.
Method (Static) Area
- Method영역, 정적영역이라고 합니다.
- JVM이 읽어들인 클래스와 인터페이스 대한 런타임 상수 풀, 멤버 변수(필드), 클래스 변수(Static 변수), 생성자와 메소드를 저장하는 공간이다.
- 인스턴스를 생성하지 않아도 사용할 수 있습니다.
- 미리 로드되어 있기에 호출시에 시간이 적게 걸립니다.
- 할당받는 메모리가 한정되어 있으며 따로 메모리 관리가 되지 않기 때문에 남발해서 사용해선 안됩니다.
따라서, static은 사용해야 하는 이유가 있어야 합니다.
Runtime Constant Pool
- 메소드 영역에 포함되지만 독자적 중요성이 있다.
- 클래스 파일 constant_pool 테이블에 해당하는 영역이다.
- 클래스와 인터페이스 상수, 메소드와 필드에 대한 모든 레퍼런스를 저장한다.
- JVM은 런타임 상수 풀을 통해 해당 메소드나 필드의 실제 메모리 상 주소를 찾아 참조한다
Heap 영역
- new를 통해 생성한 객체의 정보 (참조값 : Reference Type)이 담깁니다.
- JVM이 관리하는 프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당하여 사용하는 영역이다.
- 스레드가 공유하는 영역입니다.
- 가비지 컬렉터에 의해서 메모리가 관리됩니다.
- 힙 영역에 생성된 객체와 배열은 스택 영역의 변수나 다른 객체의 필드에서 참조한다.
- 참조하는 변수나 필드가 없다면 의미 없는 객체가 되어 GC의 대상이 된다.
- 힙 영역의 사용기간 및 스레드 공유 범위
- 객체가 더 이상 사용되지 않거나 명시적으로 null 선언 시
- GC(Garbage Collection) 대상
- 구성 방식이나 GC 방법은 JVM 벤더마다 다를 수 있다.
- 모든 스레드에서 공유한다.
Stack 영역
- 각 스레드마다 하나씩 존재하며, 스레드가 시작될 때 할당된다.
- 메소드를 호출할 때마다 프레임(Frame)을 추가(push)하고 메소드가 종료되면 해당 프레임을 제거(pop)하는 동작을 수행한다.
- 메소드 정보, 지역변수, 매개변수, 연산 중 발생하는 임시 데이터 저장
- 스레드가 공유하는 영역입니다.
- 모든 동작이 완료되면 메모리에서 사라집니다.
- 기본(원시)타입 변수(int, long, float 등)는 스택 영역에 직접 값을 가진다.
- 참조타임 변수는 힙 영역이나 메소드 영역의 객체 주소를 가진다.
PC Register
- 현재 수행 중인 JVM 명령 주소를 갖는다.
- 프로그램 실행은 CPU에서 인스트럭션(Instruction)을 수행.
- CPU는 인스트럭션을 수행하는 동안 필요한 정보를 CPU 내 기억장치인 레지스터에 저장한다.
- 연산 결곽값을 메모리에 전달하기 전 저장하는 CPU 내의 기억장치
Native Method Stack Area
- 자바 외 언어로 작성된 네이티브 코드를 위한 Stack이다.
- 즉, JNI(Java Native Interface)를 통해 호출되는 C/C++ 등의 코드를 수행하기 위한 스택이다.
- 네이티브 메소드의 매개변수, 지역변수 등을 바이트 코드로 저장한다.
출처 :
자바JAVA(6) 자바 메모리 구조(feat. JVM구동방식) - https://hoonmaro.tistory.com
마로의 Java(자바) 정리 - 8. 자바 메모리 구조 - https://blog.naver.com/chlwlstjd10