KKanging

JVM 메모리 구조 본문

JAVA/JVM

JVM 메모리 구조

천방지축 개발자 2024. 8. 13. 00:35

JVM Run Time Data Area

JVM 전체 구조

JVM 은 다음 구조를 따른다

Javac 가 컴파일한 자바 바이트 코드(.class) 를 Class Loader가 Load 한다.

→ Load 할때Run Time Data Area 에 올린다.

Load 된 데이터를 기반으로 Execution Engine (실행 엔진) 은 프로그램을 실행한다.

실행할때 RunTimeDataArea를 실행시에 메모리로 사용하는데 이를 RunTimeDataArea 를 사용한다.

이때 GC 가 힙 메모리에 불필요한 메모리를 삭제하고 메모리 주소 관리를 하는 등에 작업을 한다.

 

RunTime Data Area

JVM의 메모리 구조이다.

JVM이 실행되면 OS로 부터 메모리를 할당 받고 JVM은 메모리를 위 구조로 나누어 용도에 맞게 사용한다. 메모리 구조는 다음과 같다 .

Native Method Stack

  • 다른 언어로 작성된 코드를 실행할 때 사용되는 스택이다.

Thread 공유 메모리구조

  • Heap
    • 클래스의 인스턴스들과 배열들이 저장되는 공간
    • 가비지 컬렉션이라는 동적 메모리 관리 시스템에 의해 관리된다
  • Method
    • 런타임 상수 풀, 필드, 함수, 코드 등 클래스와 인터페이스의 구조가 저장되는 공간
  • Runtime Constant Pool
    • 런타임 상수 풀은 클래스, 인터페이스 마다 존재
    • 각 클래스, 인터페이스의 전역 변수, 함수, 인스턴스 변수, 함수에 대한 심볼릭 링크가 존재
    • 전역 변수와 전역 함수는 컴파일 시점에 할당
    • 인스턴스 변수와 인스턴스 함수는 심볼릭 링크로 존재하다가 실행 시점에 고정된 주소로 변환된다.

런타임 상수 풀은 클래스가 생성되어 Heap 에 할당될 때 만들어지며 클래스가 삭제되면 사라진다.

Method 영역은 Heap 영역과 비슷하지만 구별할 수도 있고 구분 안할 수도 있다 (따로 강제하는 명세가 없다는 의미이다.
GC 역시 Method 영역을 관리하게 할 수 있고 관리 안하게 할 수도 있다. 이는 JVM 구현마다 다르다.

Thread 당 메모리 구조

  • PC Register
    • PC Register는 자바 가상 머신이 현재 실행중인 명령어의 주소를 저장한다.
  • Stack
    • Stacke은 Frame이라는 자료구조를 저장한다.
    • Stack은 C 같이 전통적인 언어의 스택 구조와 비슷하다. - 지역 변수, 함수의 실행 결과를 저장하며 함수 호출과 반환을 담당한다.
  • Frame
    • 프레임은 데이터, 반환 값을 저장하는 자료구조이다.
    • 프레임은 함수가 호출될 때 생성되고 함수가 종료되면 사라진다.
    • 각 프레임은 지역 변수 배열(this의 인덱스는 0), Operand Stack, Run Time Constant Pool에 대한 참조값을 지닌다.
    • 클래스파일의 함수에 대한 접근은 Runtime Constant Pool에 존재하는 심볼릭 링크를 통해 접근 가능하다.
    • 동적 할당은 코드 실행 시점에 심볼릭 링크를 해석해 고정된 주소값으로 변환시킨다.
    • 심볼릭 링크를 통한 late-binding은 객체 지향의 핵심이다.
가비지 컬렉터는 메모리를 관리하는 관리자이다. GC 에 의해 관리를 하지 않는다면 메모리 공간이 부족해 StackOverFlowError 가 생기거나 성능이 크게 떨어질 것이다.

Thread 당 메모리 구조는 보통 관리가 필요 없을 정도로 자동으로 반환되거나 한다.
하지만 동적으로 할당한 Heap 영역의 데이터 들은 누군가가 관리를 해줘야 한다.
이는 가비지 컬렉터가 담당하고 가비지 컬렉터의 성능에 따라 JVM 성능이 달라질 수 있다.

 

'JAVA > JVM' 카테고리의 다른 글

JVM 가비지 컬렉터(GC) 기초  (0) 2024.08.25
JVM 클래스 로딩 과정  (0) 2024.08.13
JVM 이란?  (0) 2024.08.13