[JAVA] JVM의 메모리 구조

may_yun·2023년 4월 9일
0

JAVA

목록 보기
10/12
post-custom-banner

JVM 메모리 구조

본 블로그에서는 JVM 메모리 구조에 대해서만 정리하였습니다.

  • JVM 이란? (첨부 예정)

1. JVM 동작방식

JVM은 크게 4가지 영역으로
Class Loader, Execution Engine, Garbage Collector, Runtime Data Area로 나뉜다.

  1. 자바로 개발된 프로그램을 실행하면 JVM은 OS로부터 메모리를 할당합니다.

  2. 자바 컴파일러(javac)가 자바 소스코드(.java)를 자바 바이트코드(.class)로 컴파일합니다.

  3. Class Loader를 통해 JVM Runtime Data Area로 로딩합니다.
    (Class Loader System : 컴파일된 자바 클래스 파일을 메모리(Runtime Data Area)에 적재한다)

  4. Runtime Data Area에 로딩 된 .class들은 Execution Engine을 통해 해석합니다.

  5. 해석된 바이트 코드는 Runtime Data Area의 각 영역에 배치되어 수행하며 이 과정에서 Execution Engine에 의해 GC의 작동과 스레드 동기화가 이루어집니다.

💡 2. JVM 메모리 구조 및 할당

Runtime Data Area(자바의 메모리 영역) :
JVM이 프로그램을 수행하기 위해 운영체제로부터 할당 받는 메모리 영역
(애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역이다)

런타임 시 JVM에 할당되는 메모리 영역으로 크게 5가지 영역(JDK8 이상)
Method Area, Heap Area, Stack Area, PC Register, Native Method Stack로 나뉜다.

(아래 3개의 이미지는 모두 동일한 내용이나 이해를 돕기위해 여러개의 표를 삽입했습니다)

( 좌측 3개는 스레드 별로 생성, 우측 2개 영역은 모든 스레드가 공유)

  • 📌Method Area (Class Area, Static Area로도 불린다)
    • 필드, 생성자, 메소드, static 변수 등에 대한 정보가 담겨있다
      • 프로그램이 실행되었다고 모든 코드가 저장되어 있는 상태가 아니다. new 키워드를 통해 객체가 동적으로 생성되기 이전까지는 텍스트일 뿐, 객체 생성 후 메소드를 실행하게 됐을 때 해당 클래스 코드에 대한 정보를 Method Area에 type을 저장하게 되는 것이다.
    • type(클래스와 인터페이스를 통칭) 정보가 저장되는 영역
      • 이미지 첨부 //1)
    • 모든 스레드들이 공유하는 영역( GC의 대상 )
    • JVM 시작시 생성, 프로그램 종료 시까지 데이터 유지
    • JVM은 이 영역을 통해 실제 메모리 상의 주소를 찾아 참조
  • 📌Heap Area
    • 사용자가 관리하는 인스턴스가 생성되는 공간으로 New 연산자로 생성한 인스턴스와 배열이 런타임 시 동적으로 할당되는 영역
    • 모든 스레드들이 공유하는 영역( GC의 대상 ) 동기화 문제가 발생할 수 있다
    • 각 스레드들은 스택 영역의 참조 변수(참조하는 메모리 주소값: 포인터)를 통해 객체에 접근(객체의 위치는 우리가 알 수 없다)
      • 참조 변수의 경우 Heap에 인스턴스가 저장 되는것이 아니라 포인터가 저장되는 것
    • Eden과 Survivor로 이루어진 Young Generation과 Old, Permanent로 구성
    • Permanent 영역은 JDK8부터 Metaspace 영역으로 변경되어 Native 영역으로 이동하였다
  • Stack Area (JVM Stacks)
    • Thread 제어를 위해 사용되는 메모리 영역
    • 각 스레드마다 고유의 스택 영역이 존재
    • 메소드 내에 정의된 지역변수(기본 자료형, 참조 자료형)의 데이터 값이 저장
    • Method 가 호출 되면 Method와 Method 정보는 Stack에 쌓이게 되며 Method 호출이 종료 될때 Stack point에서 제거된다
    • Method 종료시 메모리 공간이 사라진다.
  • PC Register
    • 각 스레드 별로 PC Register를 가지며 스레드가 실행되는 부분의 주소와 명령을 저장하는 영역이다
    • Thread가 어떠한 명령을 실행하게 될지에 대한 부분을 기록
    • JVM은 Stacks-Base 방식으로 작동 하는데, JVM은 CPU에 직접 Instruction을 수행하지 않고, Stack에서 Operand를 뽑아내 이를 별도의 메모리 공간에 저장하는 방식을 취하는데, 이러한 메모리 공간
  • Native Method Stack
    • 바이트 코드가 아닌 바이너리 코드를 실행하는 영역
    • JNI(Java Native Interface)를 통해 호출되는 C/C++의 코드를 실행

//1) 이미지

static 변수는 Method Area의 Class Variable에 저장
기본형이 아닌 static 클래스형 변수는 레퍼런스 변수만 저장되고 실제 인스턴스는 Heap에 저장되어 있다. 그 후 이 인스턴스의 변수를 저장하기 위해 Heap에 메모리가 확보가 되고 Heap의 인스턴스가 Method Area의 어느 클래스 정보와 연결되는지 설정 하게 된다.


참고

profile
개발 일지
post-custom-banner

0개의 댓글