JVM이란

Alan·2023년 3월 1일
0

오늘은 JVM에 대해서 알아본다.

JVM이란?

  • Java Virtual Machine의 약자

  • Java 프로그램이 실행되는 가상 머신을 의미

  • 내부적으로 thread 및 메모리를 관리해 하나의 컴퓨터처럼 동작한다.

  • java 코드가 컴파일된 class 파일을 읽어서 실행

JVM을 쓰는 이유

  • java의 기본 특징 write once, run everywhere를 보장하기 위한 수단

  • 메모리 관리 및 다양한 운영체제에서의 호환성을 위해 사용됨

JVM의 호환성과 안정성

  • JVM은 class 파일을 jvm machine instruction을 해석해서 동작

  • Java 언어의 한계를 극복하고자, 문법이 더 좋게 만들어진 언어들도 그 결과물을 class 파일로 만들어 JVM에서 동작하도록 함

  • 이러한 전략들을 통해 JVM은 더욱 다양한 분야에서 사용되고 있음

  • 이러한 언어들로는 Groovy, Scala, Kotlin 등이 있음

JVM의 메모리

JVM 메모리 구성 요소

  • Stack Area

    • JVM에서 스레드를 생성하면 stack 영역이 자동으로 생성. 해당 스레드 안에서만 사용할 수 있는 stack 자료구조.

      • Local Variadble Array : 해당 스레드에서 필요한 지역변수들을 array로 저장

      • Operand Stack : 계산의 중간 결과물 저장

      • Frame Data : 상수 풀과 excpetion table을 가짐

  • PC Register

    • 수행할 JVM machine instruction을 올려놓는 PC register 공간. 운영체제의 PC register와 같은 역할(프로세서가 수행할 다음 명령어의 주소를 일시적으로 저장)을 담당한다.
  • Native Method Area

    • Java는 JNI(Java Native Interface)를 통해서 native library를 호출할 수 있음. 이 때 호출되는 네이티브 메소드 정보는 JNI호출을 수행하는 스레드에 올라옴
  • Shared Memory(JVM Heap)

    • 모든 스레드에서 공유되는 자원

      • 메소드와 Heap 영역의 분리는 논리적인 개념의 구분임

      • 메소드 영역 : class, method, static variables 등을 저장. 불변

      • Heap 영역 : Java object들의 저장소. GC의 대상이 되는 영역.

JVM Heap 구조

  • Metadata Space

    • 변하지 않는 정보(Class, Method, static 변수)를 저장

    • GC의 대상이 아님

  • Eden Space(Young Gen)

    • 객체가 생성되면 위치하는 공간

    • Minor GC, Full GC의 대상 공산

  • Survivor Space(Young Gen)

    • Eden의 객체가 GC에서 살아남으면 위치하는 공간

    • Space 0과 1은 교차되며 저장하고 비운다.

    • Minor GC, Full GC의 대상 공간

  • Tenured Space(Old Gen)

    • Young Gen에서 오래 살아남은 객체가 최종적으로 머무는 공간

    • Major GC, Full GC의 대상 공간

    • Old Gen의 사용량/점유율이 높을수록 GC에 의해 성능의 부하가 크다.

Memory 설정

  • 최소 메모리(Xms128m) : JVM이 기동할 때 필요한 메모리 공간

  • 최대 메모리(Xmx128m) : xms로 시작해서 최대 도달 가능한 메모리 공간. 보통 xms와 xmx를 같게 설정하여 모니터링 및 운영을 쉽게 할수 있도록 함

JVM의 GC

  • GC의 과정

  • Minor GC

    • New object는 Eden에서 생성

    • Eden이 가득차면 minor GC가 수행됨

    • GC 이후 살아남은 객체는 비어있는 Survivor-1 영역으로 이동

    • 몇 번의 minor GC에도 살아남은 Survivor-1 영역의 객체는 Old Gen 영역으로 이동

    • Eden과 survivor-0은 비워짐

    • 여기서 또 한번의 minor GC가 일어나면 Survivor-0과 Survivor-1의 역할이 바뀌며 같은 동작을 반복한다.

    • Eden → Survivor에서 Memory copy가 발생

    • Survivor → Old Gen에서 Memory copy가 발생

  • Major GC

    • Major GC는 Old Gen 영역을 정리하는 GC
    • GC 알고리즘에 따라 언제 수행되는지 달라짐
  • Full GC

    • Minor GC와 Major GC가 동시에 일어나는 현상. Full GC수행은 STW(Stop The World)를 유발한다.
    • GC 알고리즘 중 하나인 G1GC는 이 Full GC를 최소화하도록 설계됨

하지만 알고리즘이 모든 것을 보장해주지는 않음. 객체의 주기를 짧게 가져가도록 프로그래밍하고, 오래 살아남는 객체를 최소화 하면 Full GC가 최소한으로 일어나도록 할 수 있음

GC의 동작 과정

  • Graph

    • Mark : GC root에서 시작해서 참조하는 객체를 찾아가며 Mark

    • Sweep : Mark되지 않은 객체는 제거

    • Compact : Sweep에 의해 발생된 Fragmentation을 정리(연속된 메모리 공간으로 재할당)

  • GC root가 되는 항목들

    • JVM stack의 변수

    • Method Area의 static 데이터

    • JNI에서 생성된 객체

GC의 종류

  • Serial GC

    • 싱글 스레드

    • 느리고 STW가 길다

    • Mark, Sweep, Compact를 사용

  • Parallel GC

    • Young Gen의 GC를 멀티 스레드로

    • Serial GC에 비해 STW가 짧음(그림 참조)

    • ParallelOldGC는 old 영역까지 멀티 스레드로

    • Java 7, 8의 기본 GC

      • 설정법 : -XX:+UseParallelGC
      • ParalledOldGC 설정법
        • -XX:+UseParallelOldGC
        • -XX:+ParallelGCThreads=n (스레드 수 지정)
  • CMS GC

    • STW를 줄이기 위해 만든 GC

    • Mark를 4단계로 구분해서 수행

      • Initial Mark : GC Root가 참조하는 객체만 Mark
      • Concurrent Mark : 다른 스레드가 실행중인 상태에서 나머지 Mark(STW가 일어나지 않음)
      • Remark : Concurrent Mark 이후에 변경된 것을 추가하거나 삭제
      • Concurrent Sweep : 접근하지 못하는 객체를 삭제(STW 일어나지 않음)
    • 단점

      • 다른 GC보다 CPU와 Memory를 더 많이 사용
      • Compaction 단계가 기본 제공되지 않음
    • 설정

      • -XX:+UseConcMarkSweepGC
      • -XX:+CMSInitiatingOccupancyFraction=n(Old 영역의 % 지정)
  • G1 GG

    • CMS의 Fragmentation을 줄이고, GC 부하를 낮추기 위해 고안

    • Region 단위로 블럭을 나누어 관리(논리적 구분)

    • 가득 차거나 Garbage가 많은 Region만 GC의 대상임

    • 한 번에 young 및 old의 모든 영역을 GC하지 않음으로 빠르게 처리됨

    • Memoty Fraction이 적음

      • Region 크기의 50% 초과하는 객체를 따로 관리(Humongous region)함으로써 큰 객체에 의한 Fragmentation을 줄임
    • Minor GC

      • Region이 가득 차면, 살아남을 객체를 다른 Region에 할당하고, 해당 Region에는 역할(Survivor)영역을 부여함
    • Major GC

      • 빠르게 메모리를 회수할 수 없을 때 수행됨
      • Garbage가 많은 지역을 대상으로 GC 수행
      • 각 대상에 대해 concurrent하게 수행
    • 설정

      • -XX:+UseG1GC
      • Java 9 이상의 기본 GC

0개의 댓글