Skip to content

김현우, 이경민, 유동근, 박혜성 JVM

KyungMin Lee edited this page Jul 10, 2024 · 2 revisions

JVM

Untitled

❓ JDK란 무엇인가?

정의

  • 컴퓨터가 Java 바이트코드로 컴파일된 컴퓨터 언어로 작성된 프로그램을 실행할 수 있게 해주는 가상 머신
  • 플랫폼에 독립적인 실행 환경을 제공합니다.
  • 컴퓨터 언어 → Java ByteCode Compile → JVM 실행
  • JRE를 포함해요!
    • JRE? JVM과 자바 프로그램을 실행시킬 때 필요한 라이브러리 API를 함께 묶어서 배포하는 패키지

역할

  • 플랫폼 독립성 제공: 어느 운영체제에서도 자바 프로그램이 동일하게 실행될 수 있게 한다.
  • 메모리 관리: GC를 활용해서 메모리 관리를 한다!
  • 실행 환경 제공: 런타임 환경을 제공한다!

🔍 JVM 살펴보기


Untitled 1


Untitled 2

클래스 로더 서브 시스템

  • Loading
    • 클래스 로더가 .class 파일을 읽고 해당 바이너리 데이터를 생성하여 메서드 영역에 저장!
      • 바로 위 부모 클래스와 현재 클래스의 정규화된 이름
      • 클래스, 인터페이스, Enum 여부
      • Modifier, 변수, 메서드 정보
  • Linking
    • Verify, Prepare, Resolve를 수행해요!
      • Verify: .class 파일의 정확성 보장하기! → 작업이 완료되면 컴파일 할 준비가 됨을 의미합니다!
      • Prepare: static 변수를 메모리에 할당하고 메모리를 기본 값으로 초기화하기!
      • Resolve: 기호 참조를 직접 참조로 대체하는 과정입니다! → 메서드 영역 검색해서 참조된 엔티티를 찾아서 대체하기! (ex. 바이트코드에서 #21, #22)
  • Initialization
    • 코드 내의 static block과 정적 변수에 정의된 값이 할당된다! 부모에서 자식으로!
      • Bootstrap Class Loader: 핵심 자바 API 클래스를 로드합니다(java.lang.Object, Class, etc…) → 네이티브 언어로 구현되어 있어요!
      • Extension Class loader: 부트스트랩 클래스 로더의 자식 클래스 로더! 시스템 속성에 의해 정의된 클래스를 로드! → JAVA로 구현!
      • System/Application Class Loader: 확장 클래스 로더의 자식 클래스 로더! → 애플리케이션 클래스 경로에서 클래스를 로드합니다!

메모리 영역


Untitled 3

1. Method Area

  • 정적 변수를 포함하여 클래스 이름, 바로 윗 부모 클래스 이름, 메서드 및 변수 정보 등과 같은 모든 클래스 레벨 정보가 저장되는 영역
  • JVM당 하나의 메서드 영역만 있으며 공유 자원

2. Heap Area

  • 모든 객체의 정보가 힙 저장되는 영역
  • JVM당 하나의 힙 영역만 있으며 공유 자원

3. Stack Area

  • 모든 스레드에 대해 JVM이 하나의 스택을 생성하고 저장하는 영역
  • 이 스택의 모든 블럭은 메서드 호출을 저장하는 스택 프레임이라고 불림
  • 해당 메서드의 모든 지역 변수는 해당 스택 프레임에 저장
  • 스레드가 종료되면 JVM에 의해 스택이 소멸

4. PC Registers

  • 스레드에서 현재 실행할 명령의 주소가 저장됨
  • 각 스레드별로 PC 레지스터를 가짐

5. Native method stacks

  • 네이티브 메서드의 정보를 저장

실행 엔진


  • JIT 이란?

Untitled 4

Just In Time 컴파일러로 빠른 실행을 위해서 사용하는 자바의 컴파일러입니다. 클래스 파일을 실행하기 위해서는 자바 인터프린터가 실제로 실행가능한 코드로 변환을 해줍니다. 하지만 인터프린터 방식의 한계로 인해서 빠른 실행에 단점이 있습니다. 이러한 단점을 극복하기 위해서 사용하는 것이 JIT 컴파일러입니다.

  • JIT 구조

Untitled 5

  • c1 compiler (client compiler)
  • c2 complier (server compiler)
  • code cache

GC

가비지 컬렉터는 힙 영역에 할당했던 메모리 중 더 이상 참조되지 않는 객체를 모아 주기적으로 제거합니다. GC는 힙의 young 영역에서 일어나는 minor GC와 old 영역에서 일어나는 메이저 GC로 나뉩니다.

Minor GC

모든 객체는 처음에 young 영역의 eden 영역에 위치합니다. eden 영역이 가득 차면 minor GC가 실행됩니다. Mark and Sweep이라는 과정을 거쳐 참조되지 않는 객체의 메모리는 해제되고서 살아남은 객체는 survivor 영역으로 이동합니다. 다시 eden 영역이 가득차면 앞선 과정이 반복되며 살아남은 객체는 비어있는 survivor 영역으로 번갈아나가면서 이동하게 됩니다.

Major GC

young 영역에서 충분히 오래 살아남은 객체는 old 영역으로 이동하게 되고 old 영역이 가득차면 Major GC가 실행됩니다. old 영역은 young 영역에 비해 큰 메모리 공간을 가지고 있기 때문에 minor GC에 비해 긴 시간이 소요됩니다.

종류

1. Serial GC
- Young 영역은 Mark Sweep 알고리즘으로 수행
- Old 영역은 Mark Sweep Compact 알고리즘으로 수행
    Compact: Heap 을 정리하기 위한 단계로, 유효한 객체들이 연속되게 쌓이도록 힙의 가장 앞 부분부터 채워서 빈공간을 확보
- 단일 스레드로 수행되기 때문에 CPU 코어가 1개인 환경에서 사용

2. Parallel GC
- java 7,8 의 기본 알고리즘
  - 기본적인 처리 과정은 Serial GC 와 동일
  - Young 영역은 멀티 스레드를 통한 병렬 처리

3. Parallel Old GC
- Young 영역 뿐만 아니라 Old 영역도 멀티 스레드를 통한 병렬 처리
  - Old 영역에서 Mark Summary Compact 알고리즘으로 수행
    Summary: Mark 를 수행한 영역에 대해서 별도로 유효 객체를 식별

4. CMS(Concurrent Mark Sweep) GC
- java 9 에서 deprecated, java 14 에서 사용 중지
  - Mark Sweep 알고리즘을 Concurrent 하게 수행
  - CPU를 많이 필요로하며 Compaction 단계가 기본적으로 제공되지 않음
  - 조각난 메모리가 많을 경우 Compaction 작업을 실행하면 다른 GC보다 stop the world 시간이 증가

5. G1(Garbage First) GC
- java 7부터 지원, java 9 이후 기본 GC로 등극
  - Region 이라는 개념을 도입하여 Heap 영역을 균등하게 여러 Region 으로 나눔
  - garbage 가 많은(Garbage First) Region 에 대해서만 GC 를 수행하여 stop the world 시간을 줄임
  - 각 Region 을 Eden, Survivor, Available/Unused, Humongous, Old 으로 동적으로 설정

참고자료

https://velog.io/@sincewhen/Java-Class-Load-Process

https://velog.io/@mooh2jj/JIT-컴파일러란

https://hudi.blog/jvm-warm-up/

https://velog.io/@ddangle/Java-클래스-로더란

https://velog.io/@mirrorkyh/GC-종류와-특징

https://www.geeksforgeeks.org/jvm-works-jvm-architecture/

👼 개인 활동을 기록합시다.

개인 활동 페이지

🧑‍🧑‍🧒‍🧒 그룹 활동을 기록합시다.

그룹 활동 페이지

🎤 미니 세미나

미니 세미나

🤔 기술 블로그 활동

기술 블로그 활동

📚 도서를 추천해주세요

추천 도서 목록

🎸 기타

기타 유용한 학습 링크

Clone this wiki locally