java

[java] JVM이란?

hs_seo 2019. 7. 8. 16:23

JVM

  • 자바 가상 머신(Java Virtual Machine)
  • 자바 바이트 코드를 실행하는 주체
  • Linux, Window, Mac 등 OS에 맞게 구현
  • JVM Spec에 맞춰 구현
    • Oracle, Eclipse, IBM 등 여러 회사에서 구현
      • HotSpot, OpenJ9
    • JVM Language
      • JVM에서 실행가능한 언어
      • Clojure, Groovy, JRuby, Jython, Kotlin, Scala

자바 바이트 코드

  • 자바 바이트 코드 = 클래스 파일 = .class
  • 컴파일러가 .java 파일을 .class 파일로 해석
    • 자바 컴파일러, 스칼라 컴파일러, 코틀린 컴파일러 등
  • JVM은 자바 바이트 코드를 해석해서 실행
    • Write Once, Run Everywhere

JVM 주요 모듈

  • 클래스 로더(Class Loader)
    • 자바 클래스를 메모리에 적재하는 모듈
  • 메모리 공간(Runtime Data Areas)
    • Stack, Program Counter, Natiie Method Stack는 각 스레드가 독립적으로 관리
    • Method Area, Heap은 프로그램 전역으로 관리  
    • Method Area
      • 클래스, 인터페이스의 정보를 가지고 있음
    • Heap
      • new 로 생성하는 객체의 정보
    • Stack
      • 로컬 변수 정보 
    • Program Counter
      • 현재 실행위치
    • Native Method Stack
      • 네이티브 메소드 정보
  • 실행 엔진(Execution Engine)
    • 컴파일러
    • GC 모듈

JVM 힙 메모리 구조

  • Young
    • new 로 생성되는 신규 객체의 영역.
    • Eden, S0, S1 로 구성.
    • 마이너 GC의 대상
  • Old
    • Young에서 살아 남은 객체를 저장하는 영역.
    • Full GC의 대상
  • Meta
    • 클래스 객체의 정보가 보관되는 공간
    • JDK8부터 생성. JDK7 버전까지 Permenant Generation영역(PG)이었음.
    • PG영역의 메모리 누수 방지, GC 성능 개선을 위하여 메모리 구조를 변경
    • PG영역을 Metaspace와 Compressed Class Space영역으로 기능을 분할

실행 엔진

  • 컴파일러
    • 자바 바이트 코드를 기계어로 번역
    • 인터프리터 방식에서 컴파일 방식으로 변환
    • JIT 컴파일러
  • GC
    • 마이너 GC와 풀 GC
      • 마이너 GC는 Young 영역의 데이터 정리
      • 풀 GC는 Old 영역의 데이터 정리
        • JVM을 정지하고 실행하기 때문에 성능에 많은 영향을 끼침
      • 가장 좋은 GC 방법이 존재하는 것은 아님
        • 작업의 종류에 따라 적절한 GC 방법을 선택하는 것이 필요함
    • GC의 종류
      • SerialGC
        • -XX:+UseSerialGC
        • Mark-Sweep-Compact 알고리즘을 이용
        • 살아 있는 객체를 선택(Mark)-선택되지 않은 객체를 정리(Sweep)-메모리 공간을 압축(Compact)
      • ParallelGC
        • -XX:+UseParallelGC
        • SerialGC와 동일하지만 여러개의 스레드를 이용하여 동시에 처리
      • Parallel Old GC
        • -XX:+UseParallelOldGC
        • Mark-Summary-Compaction 단계
      • Concurrent Mark & Sweep GC
        • -XX:+UseConcMarkSweepGC
        • Stop-The-World 시간이 짧지만, 다른 GC에 비해 많은 메모리와 CPU를 사용하고, Compaction 단계가 기본적으로 제공되지 않음.
      • G1GC(Garbage First) GC
        • -XX:_UseG1GC
        • 메모리를 N개의 영역으로 나누어서 할당
반응형