[Java] JVM과 GC

WizHye·2025년 5월 7일

Java

목록 보기
1/2

📌 JVM (Java Virtual Machine)

  • 자바 가상 머신
    가상 머신 : 프로그램을 실행하기 위해 물리적 머신과 유사한 머신을 소프트웨어로 구현한 것
  • Java와 OS 사이에서 중개자 역할을 수행하며, Java가 OS에 구애받지 않고 재사용을 가능하게 도와줌
  • 가장 중요한 메모리 관리 수행 ( = GC; Garbage Collection )
  • 스택기반의 가상머신

🔎 왜 가상 머신을 알아야 할까?

  • 한정된 메모리를 효율적으로 사용하여 최고의 성능을 내기 위해!!
    👉 메모리 효율성을 위해 메모리 구조를 알아야함

🔎 JVM 파헤쳐보기

  • Class Loader(클래스 로더)
    • JVM 내로 클래스를 로드, 링크를 통해 배치하는 작업을 수행하는 모듈
    • Runtime 시에 동적으로 클래스를 로드
    • jar 파일 내 저장된 클래스들을 JVM 위에 탑재하고 사용하지 않는 클래스들은 메모리에서 삭제
  • Execution Engine(실행 엔진)
    • 클래스를 실행시키는 역할
  • Interpreter(인터프리터)
    • 실행 엔진은 자바 바이트 코드를 명령어 단위로 읽어서 실행
  • JIT Compiler (Just-In-Time 컴파일러)
    • 인터프리터의 단점을 보완
    • 자주 호출되는 메서드나 루프를 기계어로 컴파일하여 실행 속도 향상
    • HotSpot 기술 사용: 실행 시점에 코드 분석 후 성능 최적화
  • 클래스 로더 계층 구조
    • Bootstrap ClassLoader: JDK의 핵심 클래스(java.*) 로드
    • Extension ClassLoader: 확장 라이브러리 로드 (JDK의 lib/ext)
    • Application ClassLoader: 애플리케이션 클래스 로드
    • 부모 위임 모델(Parent Delegation Model) 사용 → 위에서부터 탐색

🚨 자바 프로그램의 실행 과정

  1. 프로그램 실행

  2. JVM은 OS로부터 이 프로그램이 필요로 하는 메모리 할당

    • JVM은 이 메모리 영역을 용도에 따라 나누어 관리
  3. 자바 컴파일러(javac)가 자바 소스 코드 (.java)를 읽어들여 자바 바이트 코드(.class)로 변환

  4. Class Loader를 통해 class 파일들을 JVM으로 로딩

  5. 로딩된 class 파일들을 Execution Engine을 통해 해석

  6. 해석된 바이트코드는 Runtime Data Areas에 배치되어 실질적인 수행

    • Runtime Data Areas : 프로그램을 수행하기 위해 OS에서 할당받은 메모리 공간
      • Method Area: 클래스 정보(메타데이터), static 변수, 상수 풀 등
      • Heap Area: 인스턴스(객체) 저장
      • Stack Area: 스레드별 프레임(지역변수, 연산 스택)
      • PC Register: 현재 실행 중인 명령어 주소 기록 (쓰레드가 시작될때 생성)
      • Native Method Stack: 네이티브 메소드 호출 시 사용

      👉 Heap/Method → 모든 스레드 공유
      👉 Stack/PC Register → 스레드별로 독립적

    👉 이러한 실행과정 속에서 JVM은 필요에 따라 Thread Synchronization과 같은 GC같은 관리작업을 수행

📌 GC (가비지 컬렉션, Garbage Collection)

  • 불필요한 메모리 낭비를 방지하기 위해 JVM이 불필요한 메모리를 정리해주는 기능

    🔎 전체적인 흐름

    • Java는 Heap 영역에 참조 타입을 저장
    • Young Generation 공간에서 새로 생성된 인스턴스 저장
    • Minor GC가 일어남
    • Old Generation 공간에서 Minor GC를 여러 번 거친 인스턴스들을 저장
    • Major GC가 일어남
profile
https://github.com/sapientia1007

0개의 댓글