jvm 가상 컴퓨터 노트 가상 컴퓨터 바이트 코드 실행 엔진
스 택 프레임 은 가상 컴퓨터 의 방법 호출 과 실행 을 지원 하 는 데이터 구조 로 가상 컴퓨터 스 택 의 스 택 요소 입 니 다.
스 택 프레임 은 부분 변수 표, 작업 스 택, 동적 연결, 반환 주소 등 을 저장 합 니 다.
모든 방법의 실행 에 대응 하 는 스 택 프레임 은 가상 컴퓨터 에서 스 택 에서 스 택 으로 나 가 는 과정 입 니 다.
스 택 꼭대기 에 있 는 스 택 프레임 만 효과 적 이 고 대응 하 는 방법 을 현재 방법 이 라 고 합 니 다.
엔진 이 실행 하 는 모든 명령 은 현재 스 택 프레임 과 현재 방법 에 만 적 용 됩 니 다.
1. 부분 변수 표
부분 변수 표 에 저 장 된 변수의 저장 공간저장 방법 파라미터 와 방법 내부 에서 정 의 된 부분 변수 표 입 니 다.
자바 가 클 라 스 로 컴 파일 되 었 을 때 부분 변수 표 에 필요 한 최대 용량 이 확정 되 었 습 니 다.
부분 변수 표 의 최소 단 위 는 Slot 입 니 다.
가상 컴퓨터 규범 은 하나의 슬롯 이 얼마나 큰 지 명확 하 게 규정 하지 않 았 다.다만, boolean, byte,... reference & return 주 소 를 내 려 놓 을 수 있 도록 규정 되 어 있 습 니 다.
reference 는 대상 실례 의 인용 을 가리킨다.reference 의 크기 에 대해 서 는 현재 지정 한 크기 가 없습니다.그러나 우 리 는 그것 이 C + + 와 유사 한 지침 이 라 고 이해 할 수 있다.
부분 변수 표 의 읽 기 방식 은 색인 입 니 다. 0 부터 시작 합 니 다.그래서 국부 변수 표 는 간단하게 하나의 표 로 이해 할 수 있다.
부분 변수 표 의 배분 순 서 는 다음 과 같다.
부분 변수 순서에 따라 Solt 를 분배 합 니 다.
하나의 변 수 는 하나의 solt 이 고 64 는 2 개의 solt 를 차지한다.자바 에서 64 위 를 명 확 히 한 것 은 long & double 입 니 다.
부분 변수 표를 최대한 절약 하기 위해 Solt 는 다시 사용 할 수 있 습 니 다.
메모: 국부 변 수 는 분 배 된 메모리 만 주 고 클 라 스 대상 의 준비 단계 가 없 기 때문에 국부 변 수 는 사용 하기 전에 값 을 먼저 부여 해 야 합 니 다.
2. 조작 스 택
조작 수 스 택 은 개념 적 으로 레지스터 와 비슷 하 다.
자바 가상 머 신 은 레지스터 를 사용 할 수 없 기 때문에 조작 스 택 에서 데 이 터 를 저장 합 니 다.
가상 컴퓨터 는 작업 스 택 을 작업 구역 으로 합 니 다. 대부분의 명령 은 여기에서 데 이 터 를 꺼 내 연산 을 한 다음 에 결 과 를 작업 스 택 으로 되 돌려 야 합 니 다.
예 를 들 어 아 디 명령 은 조작 수 스 택 에서 두 개의 정 수 를 꺼 내 덧셈 연산 을 실행 해 야 한다. 그 결 과 는 다시 조작 수 스 택 으로 누 르 고 아래 의 예 를 보 자.
이것 은 가상 컴퓨터 가 어떻게 두 int 형식의 국부 변 수 를 더 한 다음 에 결 과 를 세 번 째 국부 변수 에 저장 하 는 지 보 여 준다.
begin
iload_0 // push the int in local variable 0 onto the stack
iload_1 // push the int in local variable 1 onto the stack
iadd // pop two ints, add them, push result
istore_2 // pop int, store into local variable 2
end
스 택 의 데 이 터 를 읽 고 기록 하 는 것 은 스 택 과 같은 작업 입 니 다.
3. 동적 연결
모든 스 택 프레임 은 런 타임 풀 을 가리 키 는 참조 가 포함 되 어 있 습 니 다. 이 참조 가 있 는 것 은 동적 연결 을 지원 하기 위해 서 입 니 다.
기호 풀 의 인용 중 일 부 는 처음 사용 하거나 초기 화 할 때 확 정 된 것 으로 정적 인용 이 라 고 합 니 다.
또 일 부 는 실행 할 때마다 확인 하 는 것 이 동적 연결 이다.
4. 주 소 를 되 돌려 주 는 방법
방법 은 2 중 종료 방식 만 있 고 정상 적 인 상황 에서 return 명령 을 만 나 종료 합 니 다.그리고 이상 퇴출.
정상 적 인 상황: 일반적인 상황 에서 스 택 프레임 은 프로그램 카운터 에 저 장 된 호출 자의 주소 입 니 다.가상 컴퓨터 는 이 방식 을 통 해 호출 자의 주 소 를 실행 합 니 다.
그리고 반환 값 을 호출 자의 작업 스 택 에 눌 러 넣 습 니 다.
이상 상황: 방법 은 그 어떠한 값 도 되 돌려 주지 않 습 니 다. 주소 에 이상 표 가 있어 서 확인 합 니 다. 스 택 프레임 은 보통 정 보 를 저장 하지 않 습 니 다.
2. 방법 호출
방법 호출 단 계 는 이 방법 을 실행 하 는 것 이 아니 라 그 방법 을 사용 하 는 것 만 확인 합 니 다.class 파일 은 컴 파일 단계 에서 이 과정 을 연결 하지 않 았 습 니 다.
그래서 동적 연결 은 C + + 에 이미 있 는 기술 로 자바 에서 새로운 높이 로 활용 되 었 습 니 다.모든 함수 (사유 방법, 구조 방법 & 정태 방법, 이하 동일), 이론 적 으로
모두 가능 할 때 C + + 안의 가상 함수 입 니 다.그래서 모든 함 수 는 동적 바 인 딩 을 통 해 '명확' 한 함수 실 체 를 확인 해 야 합 니 다.
해석 하 다.
모든 방법 이 호출 된 목표 방법 은 상수 탱크 의 기호 참조 입 니 다.클래스 의 로드 분석 단계 에 서 는 일부 목표 방법 을 직접 참조 로 바 꿉 니 다.(구체 적 인 방법의 직접 주소 로 이해 할 수 있다)
전환 할 수 있 는 방법 은 주로 정적 방법 & 사유 방법 (컴 파일 기간 을 알 수 있 고 운행 기간 은 변 하지 않 음) 이다.
자바 가상 머 신 은 5 가지 방법 으로 명령 을 호출 합 니 다.
invokstatic: 정적 방법 호출
invokespecial: 인 스 턴 스 구조 기, 개인 적 인 방법 과 부모 클래스 방법 을 호출 합 니 다.
invoke virtual: 가상 방법 호출
invoke 인터페이스: 인터페이스 호출 방법
invokedynamic: 현재 실행 중 이 방법 을 동적 으로 해석 한 다음 실행 합 니 다.
invokestatic & invokespecial 에 대응 하 는 방법 은 모두 로드 분석 후 직접 확인 할 수 있 습 니 다.
그래서 이 방법 들 은 비 허 적 인 방법 이다.
자바 규정 final 수식 은 일종 의 비 허 적 방법 이다.
분파
1. 정적 할당
모든 정적 형식 에 의존 하여 포 지 셔 닝 방법 으로 버 전의 할당 동작 을 정적 할당 이 라 고 하 는데 그 전형 적 인 응용 은 방법 으로 다시 불 러 오 는 것 이다.
정적 분 파 는 실제 적 으로 방법 컴 파일 단계 에서 발생 하기 때문에 이 동작 은 실제 적 으로 가상 컴퓨터 가 실행 하 는 것 이 아니다.
Human man = new Man();
이곳 휴 먼 은 정적 유형 으로 이해 되 는데, 뒤에 있 는 맨 은 실제 유형 이다.우 리 는 컴 파일 러 에서 정적 유형 만 알 고 뒤의 실제 유형 은 동적 연결 을 할 때 알 수 있다.
가상 컴퓨터 가 다시 불 러 올 때 실제 유형 이 아 닌 매개 변수의 정적 유형 을 통 해 그 방법 을 사용 하 는 것 을 판단 합 니 다.
2. 동적 할당
실행 기간 에 실제 유형 에 따라 버 전의 할당 과정 을 동적 할당 이 라 고 합 니 다.전형 적 인 응용 은 방법 재 작성 이다.
먼저 현재 클래스 에서 '동명' 의 이 방법 을 찾 습 니 다. 없 으 면 아래 에서 위로 각 부류 에서 찾 습 니 다. 찾 을 때 까지 알 고 있 습 니 다!
이것 이 찾 은 방법 은 바로 우리 가 실제로 조정 해 야 할 방법 이다.찾 지 못 하면 exception 입 니 다.일반적인 상황 에서 컴 파일 도 구 는 우리 가 이런 상황 을 피 하 는 데 도움 을 줄 것 이다.
3. 단 분파 와 다 분파
방법 수신 자 와 방법의 매개 변 수 를 방법의 종 량 (방법의 버 전과 방법 매개 변수) 이 라 고 통칭 한다.
정적 분파 과정 에서 정적 유형 과 방법 매개 변수의 유형 을 확인 해 야 하기 때문에 정적 분파 과정 은 다 분파 이다.
방법의 선택 은 정적 컴 파일 할 때 확인 하 는 것 입 니 다 (정적 형식 을 통 해). 다만 실체 유형 을 더 확인 해 야 합 니 다.그래서 동적 분 파 는 단 분파 다.
동적 형식 언어 지원:
C + + 언어 를 사용 하면 호출 방법 을 정의 할 수 있 습 니 다.
void sort(int list[],const int size,int (*compare)(int,int));
하지만 자바 는 그 러 기 가 쉽 지 않 습 니 다.
void sort (List list, Compare c); compare 는 보통 인터페이스 로 이 루어 집 니 다.
자바 1.7 에 서 는 이 기능 을 지원 할 수 있 는 방법 이 있 습 니 다. MethodHandle 은 가상 컴퓨터 차원 에서 동적 형식 지원 을 실현 하여 다른 언어 를 쉽게 실행 할 수 있 습 니 다. 작은 응용 프로그램 은 조상 류 방법 으로 호출 할 수 있 습 니 다.
전체적으로 보면 정적 유형 이 더욱 엄밀 하고 동적 유형 이 더욱 유연 하 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.