첫째, 런타임 스택 구조
스택 프레임은 가상 머신 데이터 구조, 메소드 호출 방법 및 실행을 지원하기 위해 사용된다.
스택 프레임 로서 : 로컬 변수 테이블 오퍼랜드 스택, 동적 연결 리턴 어드레스의 방법 및 일부 추가 정보.
모든 바이트 명령어 실행 엔진은 현재 스택 프레임에 대한 동작된다. 참고 스택을 수용 할 수있는 스택 프레임이 제한된다, 너무 깊이 접근 방식 호출에 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();
}
}