JVM_03 런타임 데이터 영역 1_pc

01 메모리

메모리는 매우 중요한 시스템 리소스로, 운영 체제와 애플리케이션의 실시간 운영을 전달하는 하드 디스크와 CPU 사이의 중간웨어 하우스이자 브리지입니다. JVM의 메모리 레이아웃은 실행중인 프로세스에서 JAVA의 메모리 적용, 할당 및 관리 전략을 규정하여 JVM의 효율적이고 안정적인 운영을 보장합니다. JVM마다 메모리 분할 및 관리 메커니즘에 약간의 차이가 있습니다 (핫스팟의 경우 주로 메소드 영역을 나타냄)

여기에 사진 설명 삽입

(사진 출처 알리) JDK8의 메타 데이터 영역 + JIT 컴파일 제품은 JDK8 이전의 메소드 영역입니다.

02 파티션 소개

Java 가상 머신은 프로그램 실행 중에 사용될 여러 런타임 데이터 영역을 정의하며, 그중 일부는 가상 머신이 시작될 때 생성되고 가상 머신이 종료 될 때 삭제됩니다. 다른 것들은 카운티와 일대일 대응을하고 있으며, 이러한 스레드 대응 데이터 영역은 스레드가 시작되고 종료 될 때 생성되고 파괴됩니다.
그림과 같이 회색 영역은 단일 스레드 전용이고 빨간색 영역은 여러 스레드가 공유합니다.

  • 각 스레드 : 독립적으로 프로그램 카운터, 스택 및 로컬 스택 포함
  • 스레드 간 공유 : 힙, 힙 오프 메모리 (메소드 영역, 영구 생성 또는 메타 공간, 코드 캐시)

여기에 사진 설명 삽입
일반적으로 jvm 최적화의 95 %는 힙 영역을 최적화하고 5 %는 메서드 영역을 최적화하는 것입니다.

03 실

  • 스레드는 프로그램에서 실행되는 단위입니다. JVM을 사용하면 프로그램이 여러 스레드에 의해 병렬로 실행될 수 있습니다.
    HotSpot JVM에서는 각 스레드가 운영 체제의 기본 스레드에 직접 매핑됩니다.

  • Java 스레드가 실행 준비가되면 운영 체제의 기본 스레드도 동시에 생성됩니다. 자바 스레드 실행이 종료 된 후. 로컬 스레드도 재활용됩니다.

  • 운영 체제는 사용 가능한 CPU에 대한 모든 스레드를 예약합니다. 로컬 스레드가 성공적으로 초기화되면 Java 스레드에서 run () 메서드를 호출합니다.

2.1 JVM 시스템 스레드

  • jconsole 또는 디버깅 도구를 사용하면 백그라운드에서 실행중인 스레드가 많이 있음을 알 수 있습니다. 이러한 백그라운드 스레드에는 기본 메서드를 호출하는 기본 스레드와 기본 스레드 자체에서 만든 모든 스레드가 포함되지 않습니다.

  • 이러한 기본 백그라운드 시스템 스레드는 주로 HotSpot JVM에서 다음과 같습니다.

    • 가상 머신 스레드 L의 작업을 수행하려면 JVM이 표시되기 전에 안전한 지점에 도달해야합니다. 이러한 작업이 서로 다른 스레드에서 발생해야하는 이유는 모두 JVM이 힙이 변경되지 않도록 안전한 지점에 도달해야하기 때문입니다. 이 스레드의 실행에는 "stop-the-world"가비지 수집, 스레드 스택 수집, 스레드 일시 중단 및 편향된 잠금 취소가 포함됩니다.
    • 주기적 작업 스레드 :이 스레드는 기간 이벤트 (예 : 인터럽트)의 철회이며 일반적으로 정기적 작업의 예약 된 실행에 사용됩니다.
    • GC 스레드 :이 스레드는 JVM에서 다양한 유형의 가비지 수집 동작을 지원합니다.
    • 컴파일러 스레드 :이 스레드는 바이트 코드를 줄이고 런타임에 로컬 코드로 컴파일합니다.
    • 시그널 스케줄링 쓰레드 :이 쓰레드는 시그널을 받아 JVM으로 보내고 그 안에서 적절한 메소드를 호출하여 처리합니다.

1. 프로그램 카운터 (PC 레지스터)

JVM의 Program Counter Register에서 Register의 이름은 CPU의 레지스터에서 파생되며 레지스터는 명령어와 관련된 현장 정보를 저장합니다. CPU는 레지스터에 데이터를로드해야만 실행할 수 있습니다. JVM의 PC 레지스터는 방에있는 PC 레지스터의 추상 시뮬레이션입니다.

여기에 사진 설명 삽입

1.1 역할

PC 레지스터는 다음 명령어를 가리키는 주소, 즉 곧 실행될 명령어 코드를 저장하는 데 사용됩니다. 실행 엔진은 다음 명령어를 읽습니다.

  • 거의 무시할 수있는 작은 메모리 공간입니다. 또한 가장 빠른 저장 영역입니다.
  • jvm 사양에서 각 스레드에는 스레드 전용 인 자체 프로그램 카운터가 있으며 수명주기는 스레드의 수명주기와 일치합니다.
  • 한 스레드에는 항상 하나의 메서드가 있으며, 소위 현재 메서드입니다. 프로그램 카운터는 현재 스레드에서 실행중인 자바 메소드의 JVM 명령어 주소를 저장하거나 네이티브 메소드가 실제로 실행되는 경우 정의되지 않은 값 (정의되지 않음)입니다.
  • 프로그램 제어 흐름의 표시기입니다. 분기, 루프, 점프, 예외 처리 및 스레드 복구와 같은 기본 기능은 모두이 카운터를 사용하여 완료해야합니다.
  • 바이트 코드 인터프리터가 작동 할 때이 카운터의 값을 변경하여 실행해야하는 바이트 코드 명령을 선택합니다.
  • JVM (Java Virtual Machine) 사양에서 OOM 조건을 지정하지 않는 유일한 영역입니다.
1.2 코드 예

javap -v xxx.class를 사용하여 바이트 코드 파일을 디 컴파일하고 지침과 같은 정보를 봅니다.

여기에 사진 설명 삽입

1.3 자주 묻는 인터뷰
1. PC 레지스터를 사용하여 바이트 코드 명령어 주소를 저장하는 용도는 무엇입니까?
현재 스레드의 실행 주소를 기록하기 위해 PC 레지스터를 사용하는 이유는 무엇입니까?
  • CPU는 스레드 사이를 지속적으로 전환해야하므로 이때 다시 전환 한 후 계속 실행해야하는 위치를 알아야
    합니다. JVM의 바이트 코드 인터프리터는 다음에 실행할 단어를 결정하기 위해 PC 레지스터의 값을 변경해야합니다. 섹션 코드 지침
2. PC 레지스터가 스레드 전용으로 설정된 이유
  • 소위 멀티 스레딩이란 특정 시간 내에 스레드 중 하나를 실행하는 방법을 의미한다는 것을 우리 모두 알고 있습니다. CPU는 작업을 지속적으로 전환하여 필연적으로 잦은 중단이나 복구로 이어질 것입니다. 점수가 맞습니까? 각 스레드에서 실행중인 현재 바이트 코드 명령어 주소를 정확하게 기록 할 수 있도록 가장 좋은 방법은 자연스럽게 각 스레드에 PC 레지스터를 할당하여 각 스레드간에 독립적 인 계산을 수행하여 표시되지 않도록하는 것입니다. 상호 간섭의 상황.
  • CPU 타임 슬라이스의 제한으로 인해 여러 스레드의 동시 실행에서 특정 순간에 멀티 코어 프로세서의 프로세서 또는 코어는 특정 스레드에서 하나의 명령 만 실행할 수 있습니다.
  • 이것은 필연적으로 잦은 중단 또는 복구로 이어질 것입니다. 포인트 차이가 없는지 확인하는 방법은 무엇입니까? 각 스레드가 생성 된 후에는 자체 프로그램 카운터와 스택 프레임을 생성하고 프로그램 카운터는 스레드간에 서로 영향을주지 않습니다.
CPU 시간 조각
  • CPU 타임 슬라이스는 CPU가 각 프로그램에 할당하는 시간이며 각 스레드에는 시간이 할당됩니다. 그것을 타임 슬라이스라고 부릅니다.
  • 매크로 수준에서 : 동시에 여러 응용 프로그램을 열 수 있으며 각 프로그램은 모순없이 병렬로 실행됩니다.
  • 그러나 미시적 수준 : CPU가 하나뿐이므로 한 번에 프로그램 요구 사항의 일부만 처리 할 수 ​​있습니다. 공정성을 처리하는 방법 중 하나는 타임 슬라이스를 도입하고 각 프로그램이 차례로 실행됩니다.
병렬 및 동시성
  • 병렬 : 여러 스레드가 동시에 실행됩니다.
  • 동시성 : 코어는 여러 스레드를 빠르게 전환하여 병렬처럼 보이지만 실제로는 동시에 실행되는 순서대로 실행할 수 있도록합니다.

추천

출처blog.csdn.net/qq_43141726/article/details/114550297