바이트 실행 엔진

3628 단어
런타임 스택 프레임 구조
  • 창고 프레임은 가상 창고의 요소로 모든 방법의 호출은 창고 프레임의 입고 출고에 대응한다.창고 프레임은 국부 변수표, 조작 수창고, 동적 링크, 방법 반환 주소 등 정보를 포함한다.
  • 컴파일 단계에서 창고 프레임에 얼마나 큰 국부 변수표와 깊이의 조작수 창고가 필요한지 확인되었고 방법표의Code 속성에 기록되었다.

  • 로컬 변수 테이블
  • 컴파일하는 동안 방법의 코드 속성의 maxlocals 데이터 항목에서 이 방법이 분배해야 하는 국부 변수표의 최대 용량을 확정했다
  • 국부 변수표는 슬로트가 최소 단위이고 슬로트 32비트입니다.long과 더블 두 개를 차지합니다.0번째 슬롯은this를 저장하고 1부터 변수 순서와 작용역에 따라 슬롯을 분배합니다.
  • 클래스 변수는 준비와 초기화 단계에서 복제됩니다. 국부 변수는 이 물건이 없기 때문에 수동으로 복제해야 사용할 수 있습니다.

  • 조작 스택
  • 국부 변수표와 마찬가지로 작업 창고의 최대 깊이는 컴파일할 때 코드 속성의 max 에 기록됩니다Stacks 중.32비트 1용량, 64비트 2용량.
  • 자바 가상기의 해석 실행 엔진을'창고 기반 실행 엔진'이라고 하는데 이를 가리킨다.

  • 동적 링크
  • 모든 창고 프레임은 실행 시간 탱크에서 이 창고 프레임이 속하는 방법을 가리키는 인용을 포함하고 이 인용을 가진 것은 방법 호출 과정에서의 동적 연결을 지원하기 위한 것이다.

  • 메서드 반환 주소
  • 실행 엔진이 임의의 방법으로 되돌아오는 바이트 코드 명령, 즉 정상적인 완성 출구를 만났다.
  • 방법이 실행되는 과정에서 이상이 발생했고 이 이상은 방법 내에서 처리되지 않았다. 즉, 본 방법의 이상표에서 일치하는 이상 프로세서가 검색되지 않으면 방법이 퇴출되고 이런 방식은 이상 완성출구가 된다.
  • 어떤 방식으로 종료하든지 방법이 종료된 후에 이 방법이 호출된 위치로 되돌아간다. 방법이 정상적으로 종료될 때 호출자의 pc계수기의 값은 되돌아오는 주소로 하고 이상을 통해 종료되는 경우 되돌아오는 주소는 이상 프로세서 테이블을 통해 확정해야 한다. 창고 프레임에 일반적으로 이 부분의 정보를 저장하지 않는다.본질적으로 방법의 종료는 현재 창고 프레임이 창고에서 나가는 과정이다.

  • 방법 호출
  • 방법 집행이 아니라 호출된 방법의 버전(어떤 방법)을 확정하는 것으로 운행과 관련이 없다.Class 파일에는 직접 참조가 아닌 기호 참조가 저장되어 있기 때문입니다.두 가지 호출 방식이 있다
  • 해석 호출: 컴파일러에서 목표 방법을 정합니다.
  • 할당 호출: 재부팅, 재작성.

  • 해석
    클래스 불러오는 해석 단계에서 일부 기호 인용을 직접 인용으로 전환할 수 있다. 전제는 방법이 프로그램이 실행되기 전에 확실한 호출 버전이 있고 실행 기간이 변할 수 없다는 것이다.
  • 는 주로 정적 방법과 사유 방법을 포함한다.
  • 해석 호출은 정적 과정으로 컴파일하는 동안 완전히 확정되고 클래스가 불러오는 해석 단계에서 기호 인용을 직접 인용으로 전환한다.

  • 분파
    정적 할당: 정적 형식 클래스에 의존하여 버전을 실행합니다.일반 응용 프로그램: 다시 불러오기.해석과 분파는 배타적인 것이 아니다. 정적 분파는 클래스 마운트에서 해석을 하고 정적 방법의 재부팅도 정적 분파를 통해 재부팅 버전을 확정한다.
    public class StaticDispatch {
        static abstract class Human{
        }
        
        static class Man extends Human{
        }
        
        static class Woman extends Human{
        }
        public void sayHello(Human human) {
            System.out.println("hello human");
        }
        public void sayHello(Man man) {
            System.out.println("hello man");
        }
        public void sayHello(Woman woman) {
            System.out.println("hello woman");
        }
        
        public static void main(String[] args) {
            Human man = new Man();
            Human woman = new Woman();
            StaticDispatch sd = new StaticDispatch();
            sd.sayHello(man);
            sd.sayHello(woman);
        }
    }
    output:
       hello human
    
    Human man = new Man();
    Human         ,      。
    Man        ,      。
    

    동적 할당: 실행 기간은 실제 유형에 따라 정해진 방법의 실행 버전입니다.전형적인 응용: 다시 쓰기.
    public class DynamicDispatch {
        static abstract class Human{
            protected abstract void sayHello();
        }
        static class Man extends Human{
            public void sayHello() {
                System.out.println("hello man");
            }
        }
        static class Woman extends Human{
            public void sayHello() {
                System.out.println("hello woman");
            }
        }
        public static void main(String[] args) {
            Human man = new Man();
            Human woman = new Woman();
            man.sayHello();
            woman.sayHello();
        }
    }
    
    output:
    hello man
    hello woman
    

    *가상 시스템의 동적 할당은 어떻게 이루어집니까?동적 분배는 매우 빈번한 동작이고 방법 버전을 선택할 때 실행할 때 클래스의 메타데이터에서 적당한 목표 방법을 검색해야 하기 때문에 성능을 바탕으로 가상 머신은 클래스를 메타데이터 영역에 허방법표를 만들었다.성능을 향상시키기 위해 가상 방법을 사용하여 메타데이터를 대체합니다.허위 방법에는 각 방법의 실제 입구 주소가 저장되어 있고 자류가 부류를 다시 쓰는 방법이 없으면 부류 방법의 입구 주소가 저장되어 있다.다시 쓰면 하위 클래스 구현 방법의 입구 주소를 저장합니다.
    창고 기반 명령 집합과 레지스터 기반 명령 집합
    창고 기반: 이식 가능하며 속도가 느립니다.레지스터 기반: 속도가 빠르다.

    좋은 웹페이지 즐겨찾기