hyeonga_code

JVM_04_JVM 구성 요소_런타임 데이터 영역 Runtime Data Area 본문

JVM

JVM_04_JVM 구성 요소_런타임 데이터 영역 Runtime Data Area

hyeonga 2024. 5. 8. 08:59
반응형

JVM 구성 요소

- Class Loader
    - Bootstrap Class Loader
    - Extension Class Loader
    - System/Application Class Loader
- Execution Engine
- Runtime Data Area

 

런타임 데이터 영역 Runtime Data Area

 

프로그램의 실행 도중 사용되는 다양한 데이터를 저장하는 영역입니다.
클래스 로딩 과정이 완료되면 로드된 클래스에 대한 정보를 저장합니다.

주요 런타임 데이터 영역
  - 메소드 영역
  - 힙 영역
  - 스택 영역
  - PC 레지스터
  - 네이티브 메소드 스택

 

메소드 영역 Method Area

모든 스레드가 공유하는 메모리 영역으로 클래스 레벨의 정보 등을 저장합니다.

.class 클래스 파일에 바이트코드 형태로 저장됩니다.
JVM이 클래스를 로드할 때 이를 분석하고 메소드 영역에 저장합니다.

 

 

클래스 레벨 정보

1. 클래스 이름
패키지 이름을 포함하는 클래스의 완전한 이름으로 JVM이 클래스를 유일하게 식별할 수 있습니다.

2. 슈퍼클래스
대부분의 클래스는 상위 클래스를 가집니다. java.lang.Object는 예외
상위 클래스의 정보는 상속 관계를 정의하는데 사용됩니다.

3. 인터페이스
클래스가 구현하는 인터페이스 목록입니다.
클래스가 인터페이스의 계약을 어떻게 이행하는지 정의합니다.

4. 접근 제어자
클래스의 접근성을 정의하는 제어자입니다. public private protected default
클래스가 다른 클래스나 패키지에서 어떻게 접근할 수 있는지를 지정합니다.

5. 필드 정보
클래스에 선언된 변수(필드)의 목록입니다. 각 필드의 이름 타입 접근 제어자
필드는 인스턴스 변수클래스 변수로 구분됩니다.

6. 메소드 정보
클래스에서 정의된 메소드의 목록입니다.
메소드 이름 반환 타입 파라미터 리스트 접근 제어자 예외 정보

7. 생성자 정보
클래스 인스턴스를 초기화하는 생성자의 목록입니다.
생성자는 메소드의 일종으로 취급되며 파라미터와 예외 정보를 포함할 수 있습니다.

8. 정적 초기화 블록
클래스가 로드되고 클래스 변수가 처음으로 참조될 대 실행되는 정적 초기화 블록입니다.

9. 상수 풀 Constant Pool
리터럴 값심볼릭 참조를 저장하여 클래스 파일의 컴파일 타임 상수를 포함합니다.

 

 

 

심볼릭 참조 Symbolic Reference

클래스 파일 내부에서 클래스, 인터페이스, 필드, 메소드 등을 참조하는 데 사용되는 이름(식별자) 입니다.
동적 링킹의 해석 단계에서 심볼릭 참조를 실제 참조로 변환하는 과정입니다.
클래스가 컴파일될 때 생성됩니다.
런타임에 JVM에 의해 실제 메모리 주소나 참조로 해석됩니다.

    • 역할
      컴파일된 클래스 파일이 플랫폼 독립적으로 유지될 수 있도록 합니다.
      클래스 파일이 특정 하드웨어나 JVM 구현의 주소를 직접 포함하지 않고 심볼릭 이름을 사용하여 다른 클래스나 리소스를 참조하기 때문입니다.
      런타임에 JVM은 이러한 심볼릭 참조를 실제 로드된 클래스의 주소로 변환하여 프로그램이 올바르게 실행될 수 있도록 합니다.

      • 심볼릭 참조의 구성
        1) 클래스와 인터페이스 참조:다른 클래스나 인터페이스의 이름을 참조합니다.
        전체적으로 자격이 있는 이름을 사용합니다. `java.lang.String`2) 필드 참조: 3) 메소드 참조:특정 메소드를 식별하는 데 사용됩니다.메소드가 속한 클래스의 이름, 메소드의 이름, 메소드 시그니처(메소드의 파라미터 타입과 반환 타입)
      • 특정 클래스의 필드를 식별합니다.
        필드가 선언된 클래스의 이름, 필드의 이름, 필드의 타입
      • 상수 풀과의 관계
        심볼릭 참조는 클래스 파일의 상수 풀 에 저장됩니다.
        각 심볼릭 참조는 상수 풀 내의 유니크안 인덱스에 의해 참조됩니다.
        런타임에 JVM은 이 인덱스를 사용하여 필요한 객체나 값을 빠르게 찾아내고 해당 참조를 실제 메모리 주소나 객체에 매핑합니다.
      • 동적 링킹
        런타임 시 JVM은 심볼릭 참조를 사용하여 동적 링킹을 수행합니다.
        이 과정에서 JVM은 심볼릭 참조를 해석하여 실제 클래스, 메소드, 필드의 참조를 확인합니다.
        필요에 따라 새로운 클래스를 로드하거나 링크를 해제할 수 있습니다.
        이는 Java 가 런타임에 타입 안전성을 유지하고 라이브러리와 함께 애플리케이션 간의 강력한 결합을 피할 수 있도록 합니다.
      • JVM이 심볼릭 참조를 해석하고 실제 메모리 주소로 매핑하는 과정에서 발생할 수 있는 문제점
        1. 클래스 충돌 및 버전 문제다른 버전의 같은 클래스가 여러 개인 경우 발생합니다.
        대형 어플리케이션에서 여러 라이브러리와 프레임워크를 사용하면서 동일한 클래스를 포함하는 다른 버전의 jar 파일들이 클래스패스에 포함되는 경우 발생할 수 있습니다.
        의존성 관리 도구(Maven, Gradle) 을 사용하여 라이브러리 버전을 체계적으로 관리할 수 있습니다.
        로딩 델리게이션 모델을 사용할 수 있습니다.2. NoClassDefFoundError & ClassNotFoundExceptionJVM이 클래스 정의를 찾았으나 사용할 수 없는 경우 발생하는 NoClassDefFoundError
        클래스가 클래스패스에 존재하지 않는 경우 발생하는 ClassNotFoundException
        클래스패스 설정을 검토하고 빌드 스크립트와 배포 설정을 확인하여 모든 필요한 의존성이 있는지 확인합니다.3. 동적 로딩으로 인한 성능 문제클래스가 실제로 필요한 시점에 로드되어 초기 실행 시 지연될 수 있습니다.
          AOT_Ahead of Time 컴파일러 를 사용하여 어플리케이션 실행 전에 일부 코드를 미리 기계어로 컴파일링하면 지연을 방지할 수 있습니다.       4. 메모리 문제클래스 로드 시 메타데이터, 상수, 메소드 데이터 등이 메소드 영역에 저장됩니다.
        클래스가 로드되는 양이 증가하는 경우 메모리의 사용량도 증가하여 메모리 부족으로 인한 오류가 발생할 수 있습니다.
        JVM의 힙 크기 및 메타스페이스의 크기를 시작 옵션에서 설정하여 조정할 수 있습니다.

 

MetaSpace

java 8 이후 PermGen 저장 영역을 대체하는 영역입니다.
클래스 메타데이터, 메소드 메타데이터와 같은 JVM 메타데이터를 저장하는 영역입니다.
고정된 크기로 메모리 용량 부족 오류를 발생시킬 수 있는 PermGen을 대체하여 동적 확장성을 가지고 있습니다.

 

Class Loading Deligation Model

 

클래스 충돌과 버전 문제를 관리하는 방법입니다.
복잡한 애플리케이션과 서버 환경에서 클래스의 충돌과 버전 관리를 효율적으로 처리하도록 설계되어 있습니다.

  • 델리게이션 원칙 은 클래스 로더가 클래스를 로드하는 요청을 받으면 먼저 부모 클래스 로더에게 이 요청을 위임합니다.
    부모 클래스 로더는 이 요청을 더 상위 클래스 로더에게 위임할 수 있습니다.
    이 과정은 최상위 로더인 부트스트랩 클래스 로더까지 계속될 수 있습니다.
    최상위 로더가 요청받은 클래스를 로드할 수 없는 경우 요청은 다시 아래로 내려가 요청을 시작한 로더가 클래스를 로드하게 됩니다.

    델리게이션 모델은 모든 클래스 로더가 먼저 상위 클래스 로더로부터 클래스 로딩을 시도하게 함으로써 같은 클래스가 여러 번 로드되는 것을 방지하여 중복 로딩을 예방합니다.
    각각의 클래스 로더는 자신만의 네임스페이스를 관리하여 서로 다른 클래스 로더가 동일한 이름을 가진 클래스를 로드하더라도 서로 다른 네임스페이스에 있어 충돌을 방지할 수 있습니다.


상수 풀 Constant Pool

클래스, 메소드, 필드 및 기타 모든 참조 타입의 심볼릭 참조와 리터럴 값(문자열, 숫자)을 포함하는 인덱스화된 컬렉션입니다.

반응형