[JAVA] JVM 메모리 구조

2020. 4. 15. 22:33Computer Science/JAVA

JVM (Java Virtual Machine)

1. 정의

  º Java로 개발한 프로그램을 컴파일하여 바이트코드를 실행시키기 위한 가상머신.

 

2. 특징

  º JRE(Java Runtime Environment)에 포함

  º 자바와 운영체제사이에서 중계자 역할

  º 플랫폼 독립적으로, JVM이 실행 가능한 환경이라면 어디서든 Java 프로그램 실행 가능

 

자바 실행 과정

1. Class Loader

  º Java Byte Code(.class) JVM이 운영체제로부터 할당받은 메모리 영역인 Runtime Data Area로 적재하는 역할

  º Run 타임시 class를 load

  º 자바 애플리케이션이 실행중일 때 작업이 수행

 

2. Execution Engine

  º Class Loader에 의해 메모리에 적재된 Byte Code들을 기계어로 변경해 명령어 단위로 실행

  º JIT(Just-In-Time) 컴파일러를 이용하는 방식

    - JIT 컴파일러는 적절한 시간에 전체 바이트 코드를 네이티브 코드로 변경해서 Execution Engine이 네이티브로 컴파일된 코드를 실행하는 것으로 성능을 높이는 방식

 

3. Garbage Collector

  º Heap 메모리 영역에 할당되었다가 더 이상 참조되지 않는 객체들을 탐색 후 제거

  º GC가 역할을 하는 시간은 정확히 언제인지를 알 수 없다.(참조가 없어지자마자 해제되는 것을 보장하지 않음)

  º JRE 최신버전(11~12 이후)의 JVM에는 Heap 크기와 상관없이 일시정지 시간이 10ms 이하인 GC 알고리즘(ZGC, Shenandoah)이 탑재

 

4. Runtime Data Area

  º JVM 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역

  º Method Area, Heap Area, Stack Area, PC register, Native Method Stack 영역으로 구분

    - [Method Area, Heap Area] 모든 스레드에서 공유, [Stack Area, PC 레지스터, Native Method Stack Area] 각 스레드별로 생성

1) Method Area

  º Method, static 변수, Method Byte Code, final class 변수, Constant Pool 등이 생성되는 영역

    - Constant Pool(상수 풀) : 문자 상수, 타입, 필드, 객체 참조가 저장

  º 프로그램이 실행되면 모든 코드가 저장되어 있는 상태가 아니다.

    - new 키워드를 통해 객체가 동적으로 생성되기 이전에는 단순 텍스트

  º 객체 생성 후 메소드를 실행하게 되면 해당 클래스 코드에 대한 정보를 Method Area에 저장

2) Runtime Constant Pool

  º Class 파일 Constant Pool 테이블에 해당하는 영역

  º 클래스와 인터페이스 상수, Method와 필드에 대한 모든 레퍼런스 저장

  º JVM은 Runtime Constant Pool 통해 해당 Method의 실제 메모리 상 주소를 찾아 참조

3) Heap

  º new 키워드로 생성된 객체, 배열이 생성되는 영역

  º Method Area에서 로드된 클래스만 생성이 가능하고 Garbage Collector가 참조되지 않는 메모리를 확인하고 제거

  º Heap에 생성된 객체와 배열은 Stack Area의 변수나 다른 객체의 필드에서 참조

4) PC Register

  º 현재 수행중인 JVM 명령의 주소값이 저장되는 영역(각 Thread 별로 하나씩 생성)

5) Stack

  º 지역 변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값등이 생성되는 영역(각 Thread 별로 하나씩 생성)

6) Native Method Stack Area

  º JAVA 외 언어(ex C/C++ 등)로 작성된 Native 코드를 위한 메모리

  º C/C++ 등의 코드를 수행하기 위한 스택

  º Native 메서드의 매개변수, 지역변수 등을 Byte Code로 저장

Heap Area(Hotspot JVM 기준)

JVM Heap 영역에서는 Young Generation(Eden, Survivor)과 Old Generation으로 나누어져 있다.

 

1. Eden

  º Object가 Heap에 최초로 할당되는 장소

  º Eden 영역이 꽉 차게 되면 Object의 참조 여부를 따져 만약 참조가 되어 있는 Live Object 이면 Survivor 영역으로 넘기고, 참조가 끊어진 Garbage Object이면 남겨놓는다.

  º 모든 Live Object가 Survivor 영역으로 넘어가면 Eden영역을 모두 청소(Scavenge) 한다.

  

2. Survivor

  º Eden 영역에서 살아남은 Object들이 잠시 머무르는 곳

  º Survivor 영역은 두 개로 구성되며 Live Object를 대피시킬때 하나의 Survivor 영역만 사용.

    - 이러한 전반의 과정을 Minor GC 라고 한다.

 

3. Old Generation

  º Young Generation에서 Live Object로 오래 살아남아 성숙된 Object는 Old Generation으로 이동

    - 성숙된 Object 의미는 애플리케이션에서 특정 회수 이상 참조되어 기준 Age를 초과한 Object

  º 비교적 오랫동안 참조가 되어 이용되고 앞으로도 계속 사용될 확률이 높은 Object들을 저장하는 영역

    - 이러한 Promotion 과정 중 Old Genertation의 메모리도 충분하지 않으면 해당 영역에도 GC가 발생하는데 이를 가리켜 Full GC(Major GC)라고 한다.

 

4. Permanet & Metaspace

   º 공통점 : Class의 Meta 정보나 Method의 Meta 정보, Static 변수와 상수 정보들이 저장되는 공간으로 흔히 메타데이터 저장 영역이라고도 한다.

  º 차이점 :메모리 영역

    - Permanet : Heap 영역(JVM에서 관리)

    - Metaspace : Native 영역(OS에서 관리)

  º Metaspace가 Native 메모리를 이용함으로서 개발자는 영역 확보의 상한을 크게 의식할 필요가 없어지게 되었다.

구분 상세 구분 Permanet Metaspace
저장정보 클래스의 메타 정보 저장 저장
메소드의 메타 정보 저장 저장
Static 변수, 상수 저장 Heap 영역으로 이동
관리 포인트 메모리 관리(튜닝)

Heap 영역 튜닝

Perm 영역 별도 튜닝

Heap 영역 튜닝

Native 영역 동적 조정

GC 측명 GC 수행 대상 Full GC
메모리 측면 메모리 크기(옵션)

- XX : PermSize

- XX : MaxPermSize

- XX : MetaspaceSize

- XX : MaxMetaspaceSize

 

 

 

Reference

- https://jeong-pro.tistory.com/148

- https://limkydev.tistory.com/51

- https://namu.wiki/w/%EC%9E%90%EB%B0%94%20%EA%B0%80%EC%83%81%20%EB%A8%B8%EC%8B%A0?from=Java%20Virtual%20Machine

- https://12bme.tistory.com/382

- https://coding-start.tistory.com/205

- https://www.holaxprogramming.com/2013/07/16/java-jvm-runtime-data-area/

- https://johngrib.github.io/wiki/java8-why-permgen-removed/

 

'Computer Science > JAVA' 카테고리의 다른 글

[JAVA] SORT 사용 정리  (0) 2021.07.08