본문 바로가기
Java & Kotlin

JVM

by kiwi_wiki 2025. 1. 26.
728x90
반응형

구성 요소

  • 클래스 로더 서브 시스템(Class Loader Subsystem)
    • 자바 .class 파일을 읽어 JVM 메모리 적재
    • 역할
      • 로딩: .class 파일 로드
      • 링크: 클래스간 종속성 해결
      • 초기화: 정적 필드와 정적 블록을 실행하여 초기화
  • 런타임 데이터 영역 (Runtime Data Areas)
    • Method Area
      • 클래스의 메타데이터, 정적 변수, 상수 풀(Constant Pool) 저장
      • 모든 스레드가 공유
    • Heap
      • 객체와 배열이 저장되는 공간
      • 모든 스레드가 공유하며 Garbage Colletor가 관리
    • Stack
      • 각 스레드마다 별도로 생성되는 영역으로 메서드 호출과 관련된 로컬 변수, 매개 변수, 연산 중간 결과 저장
      • LIFO(Last In First Out) 구조
    • PC Register
      • 각 스레드마다 생성되며 현재 실행중인 명령의 주소 저장
    • Native Method Stack
      • 네이티브 메서드(C, C++ 등 자바 외부 언어로 작성된 메서드)의 실행을 지원
  • 실행 엔진(Execution Engine)
    • 자바 바이트코드를 기계어로 변환하여 실행
    • 인터프리터
      • 바이트코드를 한 줄씩 해석하여 실행
      • 빠른 실행 시작이 가능하지만 느림
    • JIT 컴파일러 (Just-In-Time)
      • 반복적으로 실행되는 코드(핫스팟)를 기계어로 컴파일하여 캐싱
      • 성능 최적화에 기여
    • Garbage Collector(GC)
      • 더이상 참조되지 않는 객체를 정리하여 메모리 확보
  • Native Interface (JNI, Java Native Interface)
    • 네이티브 라이브러리(C, C++)와 통신하기 위한 인터페이스
  • JVM 내부 실행 프로세스
    • JVM은 자바 프로그램 실행 시 OS에서 메모리와 CPU 자원을 요청하고 관리

동작 원리

  • Java 코드 작성 및 컴파일
    • .java 파일 작성 -> javac 컴파일러를 사용해 바이트코드(.class 파일) 생성
  • 클래스 로드 및 검증
    • 클래스 로더가 .class 파일을 JVM 메모리로 로드
    • 로드된 클래스가 JVM의 규칙에 맞는지 검증 (바이트코드의 유효성 확인)
  • 메모리 할당 및 초기화
    • 클래스 정보는 Method Area, 객체는 Heap, 메서드 호출 관련 정보는 Stack에 저장
  • 실행
    • Execution Engine이 바이트코드를 해석(인터프리터)하거나 JIT 컴파일러로 기계어로 변환 후 실팽
    • 네이티브 메서드 호출 시 Native Interface 사용
  • Garbage Collection
    • 더이상 참조되지 않는 객체를 자동으로 정리하여 메모리를 확보
    • 개발자가 메모리 관리를 명시적으로 할 필요가 없음

Stack 과 Heap 메모리의 차이

  • Stack
    • LIFO 구조, 메서드 호출 시 지역 변수와 함수 호출 정보 저장
    • 속도: 접근 속도가 빠르며 컴파일 타임에 크기가 고정됨
    • 용도: 메서드 호출, 지역 번수, 기본 자료형, 함수 호출 기록 등
    • 관리: 메서드 실행이 끝나면 자동으로 메모리에서 제거됨
    • 함수 내부에서 선언된 int a= 10; 은 Stack에 저장
  • Heap
    • 동적으로 메모리를 할당하며 크기가 가변적
    • 속도: Stack보다 접근 속도가 느림
    • 용도: 객체나 클래스 변수와 같은 동적으로 생성된 데이터를 저장
    • 관리: GC가 관리함
    • Person person = new Person(); 으로 생성한 객체는 heap에 저장
728x90
반응형

'Java & Kotlin' 카테고리의 다른 글

Java 에서의 동시성 관리 방법  (1) 2025.01.27
Garbage Collection  (0) 2025.01.26
Java & Kotlin 장단점  (0) 2025.01.25
PriorityQueue (우선순위 큐)  (0) 2023.07.07
Kotlin?  (0) 2022.08.28