ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] JVM 메모리 구조(Runtime Data Area) 정리
    프로그래밍/JAVA 2022. 10. 17. 21:29

    개요

    자바 개발자로서 JVM 런타임 데이터 영역에 대한 이해는 매우 중요하다. 자바로 개발을 하면서 가장 무서운 에러중 하나는 OOM(OutOfMemoryError)이다. 이것은 JVM의 메모리 영역과 관련이 있기 때문에 JVM 내부의 메모리 영역이 어떻게 동작하는지에 대한 이해가 필요하다.

     

    런타임 데이터 영역의 종류

    이러한 6가지 JVM 런타임 데이터 영역은 두 개의 그룹으로 분류될 수 있다.

    PC 레지스터, JVM 스택, 네이티브 메서드 스택은 스레드마다 독립적으로 할당된다. 이러한 영역들은 스레드가 생성될 때 같이 초기화되고, 스레드가 종료될 때 같이 회수된다.

    힙 영역, 메서드 영역, 런타임 컨스탄트 풀은 공유자원이다. JVM이 실행될 때 초기화되고, 종료될 때 같이 회수된다.

     

    PC(Program Counter) Register

    일반적으로 컴퓨터 구조 용어에서 PC 레지스터는 현재 실행하고 있는 인스럭션을 가리킨다. (포인터 같은 개념이다.) JVM에서도 똑같은 의미로 사용된다. 자바는 멀티 스레드를 지원하기 때문에, 새로운 스레드가 생성될 때 마다 새로운 PC 레지스터가 생성된다. 현재 실행되고 있는 스레드의 상태를 포인터로 가리킨다. 만약 현재 네이티브 메서드를 실행하고 있다면, PC 레지스터의 값은 정의되지 않는다.

     

    Java Virtual Machine Stacks

    JVM 스택은 자바 JVM 프레임을 저장하기 위해 사용된다. JVM은 스택을 직접 조작하지 않고 단지 프레임을 저장하기 위한 저장소이다. 스택의 메모리 크기는 고정 크기와 가변 크기로 나뉜다. 가변 크기는 필요에 따라 동적으로 확장된다. 자바 JVM 프레임은 메서드가 호출될 때 생성되고, 다이나믹 링킹을 수행한다. JVM 스택은 스레드마다 생성되고 관리된다.

    • StackOverFlowError
      • 고정 크기의 스택에서 발생하는 에러
      • 프로그램 실행동안 메모리 사이즈가 부족할 때 발생
    • OutOfMemoryError
      • 가변 크기의 스택에서 발생하는 에러
      • 필요한 메모리를 확장하려는데 더이상 충분한 메모리가 존재하지 않을 때 발생

     

    Heap Memory

    힙 영역은 객체(인스턴스)를 저장하는데 사용된다. 힙 영역은 공유 영역이므로 여러 개의 스레드가 접근할 수 있다. 힙 영역은 JVM이 실행될 때 생성된다. GC에 의해 자동으로 메모리 반환 요청이 수행됩니다. (이것이 자바의 가장 큰 특징 중 하나이다.) 만약 런타임시에 메모리가 충분하지 않다면 OutOfMemoryError가 발생한다.

     

    Method Area

    일반적으로 메서드 영역은 힙 영역의 논리적인 부분을 담당한다. 그러나 이는 JVM의 구현자의 마음이다. 메서드 영역은 각각의 클래스 구조와 필드를 가진다. 그리고 static 구조와 필드 외에는 아무것도 없다. 또한 메서드, 생성자 정보, 런타임 컨스탄트 풀을 포함한다. 힙 영역과 마찬가지로 공유 영역이며, JVM의 생명주기와 같다. 만약 런타임시에 메모리가 충분하지 않다면 OutOfMemoryError가 발생한다.

     

    Runtime Constant Pool

    런타임 컨스탄트 풀은 메서드 영역 외부에 생성되며, 클래스나 인터페이스 생성시 JVM에 의해 생성된다. 런타임 컨스탄트 풀은 클래스, 인터페이스 별로 적용할 수 있는 컨스탄트 풀 테이블을 가지고 있고, 이는 리터럴을 포함한다.

     

    Native Method Stacks

    네이티브 메서드를 지원하는 JVM은 네이티브 메서드 스택을 가진다. 스레드마다 생성되며, 네이티브 메서드를 위해 사용된다. JVM에 의해 네이티브 메서드가 로드되지 않는다면, 네이티브 메서드 스택은 필요가 없다. 메모리 크기는 일반 JVM 스택과 유사하게 관리된다.

    댓글

Designed by Tistory.