> Java > java지도 시간 > 본문

Java Virtual Machine 스택 프레임 소개(그림 및 텍스트)

不言
풀어 주다: 2019-02-01 11:47:17
앞으로
3577명이 탐색했습니다.

이 기사는 Java 가상 머신의 스택 프레임에 대한 소개(그림 및 텍스트)를 제공합니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다. .

이전에 쓴 내용: Java 가상 머신은 과학이며 많은 Java 마스터의 걸작입니다. 제 개인적인 수준과 에너지가 부족하기 때문에 모든 내용이 정확하다고 보장할 수 없습니다. 모두 신중하게 고려되었으며 일부 내용은 원본에서 인용되었습니다. 설명은 이미 매우 훌륭하므로 다시 반복하지 않겠습니다. 물론 여기에서 모든 세부 사항을 심층적으로 분석하는 것은 불가능하며, 우리는 몇 가지 더 중요한 개념에 대해서만 이야기합니다. 컴퓨터 구성 원리에 대한 깊은 이해가 부족하기 때문에 대부분은 블랙박스 이론을 통해서만 분석할 수 있습니다.

런타임 스택 프레임 구조(스택 프레임이란?)

스택 프레임은 가상 머신이 런타임을 만들기 위해 사용하는 데이터 구조입니다. 호출 및 메소드 실행, 간단히 말해서 스택 프레임은 실제로 JVM 런타임 데이터 영역에 있는 가상 머신 스택(JVM 스택)의 스택 요소입니다. 각 메소드의 실행 및 호출은 스택 프레임에 해당합니다. 간단한 예를 들자면 Stack을 정의하고 이 Statck에 스택 프레임이라는 개체를 넣습니다. 이 개체에는 지역 변수 테이블, 피연산자 스택, 동적 링크 및 메서드 반환 주소 등의 속성이 포함되어 있습니다. 다음으로 스택 프레임 객체의 구조에 대해 이야기해 보겠습니다.

먼저 스레드에서 메소드의 호출 체인이 매우 길 수 있으며 많은 메소드가 실행 상태에 있다는 점을 이해해야 합니다. 우리 실행 엔진의 경우 만 해당됩니다. 스택의 최상위에 있는 스택 프레임이 유효합니다. 이를 현재 스택 프레임(Concurrent Satck Frame)이라고 합니다. 이 스택 프레임과 관련된 메소드를 이라고 합니다. 개념적 모델은 다음과 같습니다. #🎜🎜 #

Java Virtual Machine 스택 프레임 소개(그림 및 텍스트)

스택 프레임의 개념적 모델을 통해 스택 프레임 객체의 관련 속성이 무엇인지 이야기해 볼까요? 데이터 구조는 무엇입니까? 메소드 내부에 변수를 저장합니다. 로컬 변수 테이블의 최대 용량 할당은 Java 컴파일 중에 완료되었습니다. 직설적으로 말하면 로컬 변수 테이블은 로컬 변수를 저장하는 테이블이며 변수 슬롯(Variable Slot)에 따라 용량이 결정됩니다. 슬롯이라고도 함) 관련 정보는 가장 작은 단위입니다. Zhou Zhiming의 "Java Virtual Machine 2 Edition에 대한 심층적 이해" P238을 참조하십시오. 다음은 관련 유형이 차지하는 메모리 공간입니다. data

#🎜 🎜#그림에서 알 수 있듯이 double과 long을 제외한 기본 데이터 타입은 2개의 32비트(즉, 즉, 2개의 슬롯) 저장용, 즉 높은 비트 정렬입니다. 반면에 다른 유형은 32비트 슬롯 하나만 차지합니다.

참조 유형은 32비트 또는 64비트일 수 있습니다. -bit, Java에서는 명확하게 지정되지 않습니다. 그렇다면 가상 머신은 로컬 변수에 어떻게 액세스합니까?

가상 머신은 인덱스 포지셔닝 방식을 통해 로컬 변수 테이블을 사용합니다. 인덱스 값의 범위는 0부터 최대 슬롯 수입니다. 메소드가 실행될 때, 특히 인스턴스 메소드가 실행될 때, 인스턴스 변수 테이블의 0번째 인덱스

는 메소드가 속한 인스턴스 객체의 참조 "this" 객체 下载 (1).png를 기본값으로 하고, 그 뒤에는 1을 슬롯 매개변수 변수에 메소드 내부의 로컬 변수로 연결합니다. 또한 스택 프레임 공간을 절약하기 위해 지역 변수 슬롯을 재사용할 수 있습니다. 즉, 메소드 내에서 메소드 매개변수 + 로컬 변수를 사용할 수 있습니다! =최대 슬롯 수

. 슬롯은 재사용이 가능하므로 공간 오버헤드를 절약할 뿐만 아니라 시스템의 가비지 수집에서 예상치 못한 역할을 합니다. 참조 P239

2. 피연산자 스택

피연산자 스택은 LIFO(후입선출) 스택입니다. , 기본 원리 및 저장 방법은 로컬 변수와 동일합니다. 32비트 데이터 유형의 스택 용량은 메소드가 실행될 때 언제든지 피연산자 스택의 깊이가 2입니다. max_statcks 데이터 항목에 설정된 최대값을 초과하지 않습니다. P242를 참고하세요. 요약은

1입니다. 스택 프레임이 처음 생성되면 내부의 피연산자 스택이 비어 있습니다.

2. Java 가상 머신은 피연산자 스택이 일부 데이터를 스택에 푸시할 수 있도록 하는 지침을 제공합니다. 예를 들어 로컬 변수 테이블, 인스턴스 필드의 데이터 및 기타 데이터를 스택에 푸시할 수 있습니다. 스택.
3 팝 작업을 지원하는 지침도 있습니다.

4. 다른 메서드에 전달된 매개변수도 피연산자 스택에 존재합니다.

5. 다른 메서드에서 반환된 결과는 반환 시 피연산자 스택에 저장됩니다.

6. 스택 프레임의 일부 피연산자 스택과 이전 스택 프레임의 로컬 변수 사이에는 주로 데이터 공유를 위한 특정 중복이 있습니다.

3. 동적 연결

각 스택 프레임에는 런타임 상수 풀의 스택 프레임에 지정된 메서드에 대한 참조가 포함되어 있습니다. 이 참조는 메서드 호출 중에 동적 연결을 지원하기 위해 유지됩니다. 클래스 파일의 상수 풀에는 많은 수의 기호 참조가 있습니다. 바이트코드의 메서드 호출 명령어는 상수 풀의 메서드를 가리키는 기호 참조를 매개변수로 사용합니다. 이러한 기호 참조 중 일부는 클래스 로딩 단계에서 또는 처음으로 사용될 때 직접 참조로 변환됩니다. 이 변환을 정적 확인이라고 합니다. 다른 부분은 각 런타임 중에 직접 참조로 변환됩니다. 이 부분을 동적 연결이라고 합니다.

4. 메소드 반환 주소

메소드가 실행될 때 이 메소드를 종료하는 방법에는 두 가지가 있습니다. 첫 번째 방법은 실행 엔진이 임의의 메소드에서 반환된 바이트코드 명령을 만나는 경우입니다. 이때 상위 메소드 호출자에게 전달되는 반환 값이 있을 수 있습니다(현재 메소드를 호출하는 메소드를 호출자라고 합니다). 반환 값? 반환 값의 유형은 어떤 메서드 반환 명령이 발생하는지에 따라 결정됩니다. 이 메서드 종료 메서드를 일반 메서드 호출 완료(Normal Method Invocation Completion)라고 합니다.

또 다른 종료 방법은 메서드 실행 중에 예외가 발생하고, 해당 예외가 Java 가상 머신 내부에서 생성된 예외이든 throw 바이트코드를 사용하여 발생한 예외이든 메서드 본문 내에서 처리되지 않는 것입니다. 이 메소드의 예외 테이블에 일치하는 예외 핸들러가 없으면 이 종료 메소드를 Abrupt Method Invocation Completion이라고 합니다. 예외 완료 종료를 사용하여 메서드가 종료되면 해당 호출에 대한 반환 값이 생성되지 않습니다.

어떻게 종료하든 메소드가 종료되기 전에 프로그램이 계속 실행될 수 있도록 메소드가 호출된 위치로 돌아가야 합니다. 메소드가 반환되면 일부 정보를 스택 프레임에 저장해야 할 수도 있습니다. 상위 메소드 실행 상태를 복원하는 데 도움이 됩니다. 일반적으로 메서드가 정상적으로 종료되면 호출자의 PC 카운터 값을 반환 주소로 사용할 수 있으며, 이 카운터 값은 스택 프레임에 저장될 가능성이 높습니다. 메소드가 비정상적으로 종료되면 반환 주소는 예외 처리기에 의해 결정되어야 하며, 이 정보는 일반적으로 스택 프레임에 저장되지 않습니다.

메서드 종료 프로세스는 실제로 현재 스택 프레임을 팝하는 것과 동일하므로 종료 시 가능한 작업은 상위 메서드의 지역 변수 테이블과 피연산자 스택을 복원하고 반환 값(있는 경우)을 호출에 푸시하는 것입니다. 두 스택 프레임의 피연산자 스택에서 PC 카운터의 값은 메서드 호출 명령어 뒤의 명령어를 가리키도록 호출됩니다.

5. 추가 정보

가상 머신 사양을 사용하면 사양에 설명되지 않은 일부 정보(예: 높이 관련 정보)를 스택 프레임에 추가할 수 있습니다. 가상 머신. 실제 개발에서는 동적 연결, 메서드 반환 주소 및 기타 추가 정보가 일반적으로 스택 프레임 정보라는 하나의 범주로 그룹화됩니다.

위 내용은 Java Virtual Machine 스택 프레임 소개(그림 및 텍스트)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:cnblogs.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!