JVM의 깊이 이해 : 가상 머신 바이트 코드의 실행 엔진

첫째, 런타임 스택 구조

스택 프레임은 가상 머신 데이터 구조, 메소드 호출 방법 및 실행을 지원하기 위해 사용된다.

스택 프레임 로서 : 로컬 변수 테이블 오퍼랜드 스택, 동적 연결 리턴 어드레스의 방법 및 일부 추가 정보.

모든 바이트 명령어 실행 엔진은 현재 스택 프레임에 대한 동작된다. 참고 스택을 수용 할 수있는 스택 프레임이 제한된다, 너무 깊이 접근 방식 호출에 StackOverflowError은 물론, 우리가 추측 할 수 일으킬 수있는 세트 스택의 크기가. 모델 다이어그램은 약으로 다음 어느 있습니다 : 

è¿è¡æ¶æ ç»æ

모든 바이트 코드 지침 실행 엔진은 현재 스택 프레임에 대한 운영하고 있습니다.

(1), 로컬 변수 테이블

공정 파라미터 및 방법에 의해 저장 공간 변수 값, 로컬 변수 용량 슬롯 조성물 내에 정의 . (1) 의 최소 단위로서.

슬롯 (32)은 상기 데이터 타입에 저장 될 수있다. 슬롯의 길이는 서로 다른 프로세서, 운영 체제 또는 가상 머신으로 변경 될 수 있습니다.

지역 변수 테이블의 크기는 max_local의 코드, 컴파일시에 결정될 수있다.

지역 변수 테이블 시스템 초기화 지역 변수의 정의는 인간이 만든 초기화, 또는해야 한 번 사용할 수있는 수단이 존재하지 않습니다.

JVM이 사용하는 타겟팅 의해 인덱싱 로컬 변수 테이블 .

상기 방법을 수행 할 때, 상기 방법은 인스턴스의 경우, 다음의 로컬 변수 테이블 인덱스의 첫번째 비트 0은 기본 클래스 인스턴스 관련 방법을 전송하기위한 기준 슬롯 (즉 이것을).

2 오퍼랜드 스택

피연산자 스택 의 최대 깊이도 max_stacks 코드 속성 데이터 항목의 번역에 기록됩니다.

또한, 우리는 자바 가상 머신 해석 엔진은 스택을 의미 스택 기반 실행 엔진,라고 말할 피연산자 스택 .

오퍼랜드 스택은 각각의 요소는 임의의 유형의 Java 수있다.

역할 : 연산을 수행 할 때, 오퍼랜드 스택에 전달하거나 때에는 다른 메소드를 호출 할 오퍼랜드 스택 파라미터를 전달.

두 스택 프레임 (로컬 변수 및 오퍼랜드 스택 테이블) 개의 스택 프레임은 부분적으로 중첩이 발생되도록, 우리가 어떤 JVM을 최적화 할 것이며, 서로 완전히 독립적이다.

(3) 동적 연결

각 스택 프레임 스택 런타임 상수 풀 관련 방법이 참조 기호에 대한 포인터, 참조 (레퍼런스 심볼에 직접 참조)지지 동적 메소드 호출 프로세스 연결을 유지하는 것이다.

4, 방법은 주소를 반환

실행 방법 후이 방법을 종료하는 방법은 두 가지가 있습니다 :

(1) 실행 엔진은 어떤 메소드가 복귀의 바이트 코드 명령어 출구 소위 정상 완료 발생.

(2)의 이상을 수행하는 과정에서 발생하고 긴 예외 처리기에있어서의 예외 테이블에서 검색 일치하지 것처럼, 본 방법은 종료로 이어질 즉 예외는, 상기 방법으로 처리되지 않으며, 이러한 비정상적인 방법은 수출을 완료합니다.

방법 종료 메소드의 위치를 반환 한 후 출구를 통해 방법에 상관없이이라고합니다. 이것은 리턴 어드레스의 저장 위치입니다 .

둘째, 메소드 호출

메소드 호출 방법의 실시와 일치하지 않는, 메소드 호출은 버전 (방법)을 결정하는 방법을 호출한다.

1 파싱 (클래스 로딩 단계있는 직접 참조로 참조 기호의 일부).

전제 : 전화의 버전을 확인하고 변경할 수 실행할 수있는 프로그램을 실행하기 전에 방법. 이 조건의 준수는 정적 메소드 전용 방법 인스턴스 생성자 상위 호출 할 수있는 방법의 클래스 가상이 아닌 방법 (뿐만 아니라 최종) 다형성 아니다.

2, 파견

- 변수 : 매개 변수가 소포받는 사람과 접근 방법의 방법이라고합니다. 

정적 할당 : 정적 송출 방법은 정적 할당하게 컴파일시에 발생 찾을 버전 3을 입력 한 모든 종속성을 수행 전형적인 애플리케이션은 메소드이다 오버로딩 .
동적 할당 : 방법의 버전을 결정하는 단계 (4)은 전달 동작 동안 동적 방식으로 실제 할당에있어서, 프로그램 실행 동안 통상적 인 애플리케이션의 실행 방법 발생 재기록 .
단일 디스패치 : 5에있어서의 타겟의 양에 따라 선택 하였다. 동적 진영 그들 중 하나입니다.
다중 송출 : 하나 개 이상의 방법보다 케이스의 목표량을 선택. 하나 개의 정적 할당.

셋째, 스택 기반 실행 엔진 바이트

public class MainTest {
    public  static int add(){
        int result=0;
        int i=2;
        int j=3;
        int c=5;
        return result =(i+j)*c;
    }

    public static void main(String[] args) {
        MainTest.add();
    }
}

AEA»¤0æ§è¡

AEA»¤1æ§è¡

AEA»¤2æ§è¡

AEA»¤3æ§è¡

AEA»¤5æ§è¡AEA»¤7æ§è¡

AEA»¤8æ§è¡

AEA»¤9æ§è¡

 

AEA»¤10æ§è¡

AEA»¤11æ§è¡

AEA»¤12æ§è¡

AEA»¤13æ§è¡

AEA»¤14æ§è¡

AEA»¤15æ§è¡

 

 

게시 된 134 개 원래 기사 · 원의 찬양 (91) · 전망 160 000 +

추천

출처blog.csdn.net/weixin_44588495/article/details/104137067