[Java] JVM, Java메모리 구조

hyeok ryu·2024년 5월 23일
0

Java

목록 보기
1/1

00. JVM(Java Virtual Machine)

JVM은 자바 바이트코드(.class)를 실행할 수 있게 해주는 가상 머신으로
Java 프로그램이 OS에 상관없이 실행될 수 있도록 해주는 자바 개발 철학을 실현하는 핵심 요소이다!

01. JVM의 구성

크게 4가지로 분류할 수 있다.

  • Class Loader
  • Execution Engine
  • Garage Collector (GC)
  • Runtime Data Area

02. Java 실행 과정

우선 Java가 어떻게 실행되는지 과정에 대해서 이해해보자.

  1. Java Application이 실행되면, JVM이 OS로 부터 메모리를 할당 받는다.
  2. Java Compiler(javac.exe)가 작성한 Java code(.java)파일을 읽어 Java 바이트 코드(.class)로 변환한다.
  3. Class Loader에 의해 JVM으로 바이트 코드가 올라간다.
  4. Execution Engine에 의해 로딩된 바이트 코드가 해석된다.
  5. Runtime Data Area에 해석된 바이트 코드가 배치되고 실행된다.

03. 구성요소

Execution Engine

Runtime Data Area에 할당된 바이트 코드를 실행시키는 주체

  • Interpreter
    • 바이트 코드를 해석해서 실행
    • 동일한 메소드라도 호출될 때마다 매번 새롭게 수행
  • JIT Compiler (Just In Time Compiler)
    • Interpreter와 달리 반복되는 코드를 Native Code로 변경하여 사용
      • Native -> C, C++ 등 Java 구성언어를 의미
  • Garbage Collector
    • 더이상 참조되지 않는 메모리를 모아서 제거
      • e.g) C, C++에서 free, delete 등으로 메모리를 해제하는 작업을 GC가 자동적으로 대신 수행한다.
    • 자동적으로 수행되나, System.gc()를 이용하여 수동으로 요청 가능(실행 보장X)
    • GC에 대한 Performance Tuning을 통해 조금 더 최적화가 가능함.

Garbage Collector

Garbage : 앞으로 사용되지 않는 객체의 메모리
Garbage Collction : Garbage를 정해진 스케쥴에 의해 정리해주는 것.

Stop The World(STW)

GC(Garbage Collection)를 수행하기 위해서 JVM이 일시적으로 멈추는 현상이 발생한다.
GC가 작동하는 동안 GC관련 Thread를 제외한 모든 Thread가 멈추기 때문에
Stop The World라고 칭한다.

GC에 대한 Performance Tuning을 한다는 것은 이 시간을 최소화 하는것을 의미한다.

Java 8버전에서는 Parallel GC를 사용하고 있으며, 9~10에서는 default로 G1 GC를 사용하고 있다.
Application 상황에 맞는 GC를 사용하는 것이 좋다.

Class Loader

JVM으로 바이트 코드를 로드하고, 링크를 통해 배치하는 작업을 수행

로드된 바이트 코드를 연결하여 JVM의 메모리 영역에 배치한다.
클래스를 메모리에 로딩할 때는 한 번에 모두 올리지 않고, 어플리케이션에서 필요에 따라 동적으로 메모리에 적재하여 사용한다.
(Loading -> Linking -> Initalization 으로 구성됨)

Runtime Data Area

Application이 동작하기 위해 OS에서 할당받은 메모리 공간

크게 5가지의 공간으로 구성되어 있다.

  • Method Area
    • class 레벨의 데이터, static 변수가 저장된다.
    • JVM 전체에서 단 하나의 Method Area가 존재.
    • 저장되는 정보의 종류
      • Field Info : 멤버 변수명, 데이터 타입 등
        • Method Info : 메소드 명, return 타입, 매개변수 등
        • Type Info : class인지 interface인지 등
    • GC의 관리 대상이다.
    • 여러 Thread들 간에 공유되는 메모리
  • Heap Area
    • 객체를 저장하기 위한 메모리 영역
    • new 연산으로 생성된 모든 Object 및 Instance변수가 저장된다.
    • GC의 관리 대상이다.
    • Heap 영역은 물리적으로 2개의 영역으로 구분할 수 있다.
    • 여러 Thread들 간에 공유되는 메모리
    young generation:
    	생명 주기가 짧은 객체를 GC 대상으로 하는 영역
    	오래 사용되는 객체는 old generation으로 이동시킨다.
        
    old generation: 
    	생명 주기가 긴 객체를 GC 대상으로 하는 영역
  • Stack Area
    • 각 Thread를 위한 분리된 Runtime Stack 영역
    • 메소드를 호출 할때마다, Entry(Stack Frame)가 Stack Area에 생성된다.
    • Thread의 역할이 종료되면 바로 소멸되는 특성의 데이터를 저장한다.
    • 각종 형태의 변수, 임시데이터, Thread, Method 정보를 저장한다.
  • PC Register

    • PC : Program Counter
    • 각 Thread가 시작될 때 생성되며, 실행중인 상태 정보를 저장
    • Thread가 로직을 처리하면서 지속적으로 갱신되며, Thread 당 1개씩 존재한다.
    • 어떤 명령을 실행해야 할지에 대한 기록
  • Native Method Stack

    • 바이트 코드가 아닌 실제 실행가능한 기계어로 작성된 프로그램을 실행 시키는 영역
    • Java외 다른 언어로 작성된 코드를 위한 영역
    • Java Native Interface를 통해 바이트 코드로 전환하여 저장
    • 각 Thread 별로 생성된다.

JNI, Java Native Interface?
자바가 다른 언어로 만들어진 어플리케이션과 상호 작용할 수 있는 인터페이스

0개의 댓글