[Java] JVM 메모리 구조

dustle·2023년 6월 6일
1

Java Compiler 에 의해 .java -> .class 로 변환되고 JVM 은 바이트 코드를 해석하는 역할을 합니다.

JVM 의 구조

Class Loader

클래스를 처음으로 참조할 때 .class 로 생성된 파일들을 로드하고 JVM 이 운영체제로부터 할당받은 메모리 영역인 Runtime Data Area 로 링크하는 모듈입니다.
Runtime 시에 동적으로 실행됩니다.

Excecution Engine

메모리에 적재된 바이트 코드를 기계어로 변경해 명령어 단위로 실행하는 역할을 합니다.
인터프리터 방식과 JIT 컴파일러를 이용하는 방식이 있습니다.

  • 인터프리터 - 바이트 코드를 명령어 단위로 읽어서 실행합니다. 하지만 한 줄 씩 수행하기 때문에 느립니다.
  • JIT - 인터프리터 방식으로 실행하다가 적절한 시점에 바이트 코드 전체를 컴파일하여 네이티브 코드로 변경하고 네이티브 코드를 직접 실행합니다. 네이티브 코드는 캐시에 저장되어 한 번 컴파일 하면 빠르게 수행됩니다.

GC(Garbage Collector)

Heap 메모리 영역에 생성 된 객체들 중에 참조되지 않는 객체를 탐색 후 제거합니다.

Runtime Data Area(JVM 메모리)

JVM 의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터를 적재합니다.

PC Register

스레드가 시작될 때 생성되며, 스레드마다 하나씩 존재합니다.
스레드가 어떤 부분을 어떤 명령으로 실행해야할 지에 대한 기록을 하는 부분으로 현재 수행 중인 JVM 명령의 주소를 갖습니다.

JVM Stack

프로그램 실행과정에서 임시로 할당되었다가 메소드를 빠져나가면 소멸되는 데이터를 저장하기 위한 영역입니다.
변수, 임시 데이터, 스레드, 메소드 정보를 저장합니다.
메소드 호출 시 스택 프레임이 생성되고, 수행이 끝나면 프레임 별로 삭제됩니다.

Native Method Stack

컴파일 후 생성되는 바이트 코드가 아닌 기계어로 작성된 프로그램을 실행시키는 영역입니다.

Method Area

클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간입니다.
대부분의 인스턴스의 생성은 메소드 안에서 생성되기 때문에 거의 모든 메소드 바이트 코드가 올라갑니다.
Runtime Constant Pool 이라는 별도의 관리 영역도 존재합니다.

올라가는 정보
1)Field
멤버변수 이름, 데이터 타입, 접근제어자 정보
2)Method
메소드 이름, 리턴 타입, 매개변수, 접근제어자 정보
3)Type
class/interface 여부, 전체 이름 등등

Heap

객체를 저장하는 가상 메모리 공간입니다.
new 연산자로 생성된 객체와 배열을 저장합니다.
메소드 영역에 로드된 클래스만 생성이 가능하고 GC 가 참조되지 않는 메모리를 확인하고 제거합니다.

참고
https://asfirstalways.tistory.com/158
https://jeong-pro.tistory.com/148

0개의 댓글