[JVM Internal] 1. JVM 메모리 구조

황세호·2021년 8월 25일
0

Java

목록 보기
6/6

1.1 JVM이란?

JVM은 정의된 스펙을 구현한 하나의 독자적인 프로세스 형태로 구동되는 Runtime Instance이다. 따라서 JVM의 역할을 개발자들이 작성한 Java 프로그램의 범주에 들어가는 모든 것들을 실행시키는 기본 데몬을 JVM이라고 칭한다.

Java에서 프로그램을 실행시키는 과정

  1. .java파일을 컴파일 과정을 통해 Class파일을 생성한다.

  2. 생성된 Class파일을 JVM으로 로딩하고 ByteCode를 해석한다.

  3. 메모리 등의 리소스를 할당하고 관리하며 정보를 처리하는 일련의 작업들을 포괄한다.

이 때 JVM은 Thread 관리 및 GC와 같은 메모리 정리 작업도 수행하게 된다.

  • Class Loader : JVM 내로 .class 파일들을 Load하여 Loading된 클래스들을 Runtime Data Area에 배치된다.

  • Execution Engine : Loading된 클래스들을 Runtime Data Areas에 배치한다.

  • Runtime Data Area : JVM이라는 프로세스가 프로그램을 수행하기 위해 OS로부터 할당받은 메모리 공간이다.

자, 이제부터 영역 중에서 Runtime Data Areas의 내부에 대해 좀 더 자세히 알아보자.

  • Method Area : 클래스, 변수, Method, static변수, 상수 정보 등이 저장되는 영역(모든 Thread가 공유한다).

  • Heap Area : new 명령어로 생성된 인스턴스와 객체가 저장되는 구역(GC 이슈는 이 영역에서 일어나며, 모든 Thread가 공유한다).

  • Stack Area : Method 내에서 사용하는 값들(매개변수, 지역변수, 리턴값 등)이 저장되는 구역으로 메소드가 호출될 때 LIFO로 하나씩 생성되고, 메소드 실행이 완료되면 LIFO로 하나씩 지워진다.

  • PC Register : 현재 수행 중인 JVM 명령의 주소값이 저장된다.

  • Native Method Stack : 다른 언어(C/C++ 등)의 메소드 호출을 위해 할당되는 구역으로 언어에 맞게 Stack이 형성되는 구역이다.

1.2 Java Heap

Hotspot JVM의 Heap 구조

Hotspot JVM은 크게 Young GenerationOld Generation으로 나누어져 있다.

Young Generation

Young Generation은 Eden 영역과 Survior영역으로 구성되는데 Eden 영역은 Object가 Heap에 최초로 할당되는 장소이다.

Eden 영역이 꽉 차게 되면 Object의 참조 여부를 따져 만약 참조가 되어있는 Live Object이면 Survior 영역으로 넘기고, Garbage Object이면 그대로 둔다.

모든 Live Object가 Survior로 넘어가면 Eden 영역을 모두 청소한다. 이러한 전반적인 과정을 Minor GC라고 한다.

그렇다면, 살아남은 Live Object들은 계속 Survior 영역에 있는가?

Young Generation에서 Live Object로 오래 살아남은 Object는 Old Generation으로 이동하게 된다.

여기서 오래 살아남은 Object라는 의미는 애플리케이션에서 특정 회수 이상 참조되어 기준 Age를 초과한 Obejct를 말한다.

즉, Old Generation 영역은 새로 Heap에 할당되는 Object가 들어오는 곳이 아닌, 비교적 오랫동안 참조가 되어 앞으로도 계속 사용될 확률이 높은 Object들을 저장하는 영역이다.

이러한 Promotion 과정 중 Old Generation의 메모리가 초과할 시에 해당 영역에서도 GC가 발생하는데 이를 Full GC(Major GC)라고 한다.

Perm 영역

  • Perm 영역은 보통 메타데이터가 저장되는 영역이다.
  • Java 8부터는 Native 영역으로 이동하여 Metaspace 영역으로 변경되었다.

Java 8에서 JVM 메모리 구조적인 개선 사항으로 Perm 영역이 사라지고, Metaspace 영역으로 전환되었다. Metaspace 영역은 Heap이 아닌 Native 메모리 영역으로 취급하게 된다.(Heap 영역은 JVM에 의해 관리된 영역, Native 영역은 OS레벨에서 관리하는 영역으로 구분)

-> Metaspace가 Heap이 아닌 Native 영역으로 변경되면서 개발자는 영역 확보의 상한을 크게 의식할 필요가 사라졌다.

Java 7까지의 Perm 영역과 Java 8 Metaspace 영역의 변경 사항은 아래 표와 같이 정리할 수 있다.

profile
Developer

0개의 댓글