본문 바로가기
TIL

[TIL] 24.03.11

by 준팍(junpak) 2024. 3. 11.

JVM 구조와 클래스로더

JVM은 자바 바이트코드를 실행시키는 가상 머신으로, 자바 애플리케이션이 다양한 운영 체제에서 동일하게 실행될 수 있도록 합니다.
크게 "클래스로더 시스템", "메모리", "실행 엔진", 그리고 "네이티브 메소드 인터페이스와 라이브러리" 네 부분으로 구분할 수 있습니다.

클래스 로더 시스템
클래스 로더 시스템은 JVM이 클래스를 처음으로 참조할 때 그 클래스를 로드하고, 링크하고, 초기화하는 책임을 집니다.

클래스 로더의 과정

  • 로딩
    클래스 로더는 .class 파일을 읽고, 그 내용을 바탕으로 적절한 바이너리 데이터를 생성하여 메소드 영역에 저장합니다.
    여기에 저장되는 데이터에는 FQCN(Fully Qualified Class Name), 클래스, 인터페이스, Enum, 메소드, 변수 등이 포함됩니다.
    로딩이 완료되면, 해당 클래스 타입의 Class 객체가 생성되어 힙 영역에 저장됩니다.

  • 링크: 로딩된 클래스는 다음 세 단계의 링크 과정을 거치게 됩니다.
    Verify: .class 파일 형식이 유효한지 검사합니다.
    Preparation: static 변수와 이들의 기본값에 필요한 메모리를 준비합니다.
    Resolve(선택적): 심볼릭 메모리 레퍼런스를 메소드 영역의 실제 레퍼런스로 교체합니다.

  • 초기화: 클래스 변수의 적절한 값으로 초기화합니다.
    이는 static 변수들을 초기화하고, 만약 static 블록이 존재한다면 이 시점에 실행됩니다.

클래스 로더의 계층 구조

  • 부트 스트랩 클래스 로더: JAVA_HOME/lib에 있는 코어 자바 API를 로드합니다.
  • 플랫폼 클래스로더: JAVA_HOME/lib/ext 폴더나 java.ext.dirs 시스템 변수에 명시된 위치의 클래스를 로드합니다.
  • 애플리케이션 클래스로더: 애플리케이션 클래스패스(-classpath 옵션 또는 java.class.path 환경 변수의 값)에서 클래스를 로드합니다.

메모리
JVM 메모리는 공유 자원과 스레드 자원으로 나누어집니다:

  • 공유 자원: 모든 스레드에 의해 공유됩니다.
    메소드 영역: 클래스 수준의 정보(클래스 이름, 부모 클래스 이름, 메소드, 변수 등)를 저장합니다.
    힙 영역: 모든 객체 인스턴스와 배열을 저장합니다.
  • 스레드 자원: 각 스레드마다 독립적으로 유지됩니다.
    스택 영역: 스레드별 런타임 스택이 생성되며, 각 메소드 호출시 생성되는 스택 프레임을 포함합니다.
    PC(프로그램 카운터) 레지스터: 스레드별로 현재 실행중인 스택 프레임을 가리키는 포인터가 있습니다.
    네이티브 메소드 스택: 네이티브 메소드(Java가 아닌 언어로 작성된 메소드) 호출시 사용되는 스택입니다.

실행 엔진
실행 엔진은 바이트코드를 실제로 실행하는 역할을 합니다. 주요 구성 요소는 다음과 같습니다:

  • 인터프리터: 바이트 코드 명령어를 하나씩 해석하고 실행합니다.
  • JIT(Just-In-Time) 컴파일러: 실행 시간 동안 바이트 코드의 "핫 스팟"(자주 실행되는 코드 부분)을 검출하고, 이를 직접 기계어로 컴파일하여 성능을 향상시킵니다.
  • 가비지 컬렉터(GC): 참조되지 않는 객체를 자동으로 검출하고, 메모리에서 제거하여 자원을 회수합니다.

네이티브 메소드 인터페이스와 라이브러리
JVM은 Java가 아닌 언어로 작성된 코드와 상호작용하기 위해 네이티브 메소드 인터페이스(JNI)를 제공합니다.
이를 통해 C, C++ 등 다른 언어로 작성된 함수를 Java에서 호출할 수 있습니다.
또한, 네이티브 라이브러리를 통해 운영 체제의 기능이나 하드웨어 수준의 기능에 접근할 수 있습니다.

leetcode

    1. Custom Sort String
    1. Convert Sorted Array to Binary Search Tree

괜찮을지도 당시 공부했던 내용 정리

'TIL' 카테고리의 다른 글

[TIL] 24.03.13  (0) 2024.03.13
[TIL] 24.03.12  (0) 2024.03.12
[TIL] 24.03.10  (0) 2024.03.10
[TIL] 24.03.09  (0) 2024.03.09
[TIL] 24.03.08  (0) 2024.03.08