2011-08-28 2 views
9

자바 JVM이 예외를 던질 가능성이있는 메소드를 인라인하는 것이 가능한지 궁금합니다. 필자는 배열 접근을 가지고 있으며 따라서 ArrayIndexOutOfBoundsException을 던질 가능성이있는 메소드와 같은 메소드를 인라인 할 수 있다고 가정합니다. 내가보기에 문제는 실제로 예외가 발생하면 메서드를 인라인했다면 적절한 스택 추적을 어떻게 표시합니까? 서로 다른 메소드가 서로 다른 머신에 인라인 될 수 있기 때문에 인라인으로 스택 트레이스 메커니즘을 깨지 않을 수 있습니까?예외를 throw하는 메서드는 어떻게 인라인 될 수 있습니까?

+2

C++에서 인라인은 스택 정보 손실을 거의 보장합니다. 예외 스택 추적에 프레임이 누락되었다는 사실은 세상의 종말은 아닙니다. 이것은 인라이닝의 결과로 받아 들여지는 것입니다 (그리고 컴파일러가 모든 인라인을 억제하는 디버그 모드 옵션을 제공하는 이유 중 하나). 나는 자바가 똑같이 행동하는지 아닌지를 모른다. –

+0

이 질문은 Java의 질문이지만, C++에서도 이것이 어떻게 작동하는지에 대해 흥미로운 내용이었습니다. – Gravity

답변

8

당신이 생각하는 문제는 무엇입니까? 인라이닝을 수행하는 것은 JVM 자체이기 때문에 Throwable 객체에 설치할 스택 트레이스를 생성 할 때 어디에서 인라인되었는지 기억하고있는 것을 기억하지 못합니다.

예외가이 던져진 경우 이 생성되면 JVM은 CPU 스택을 걸어서 각 기계 스택 프레임이 해석 된 바이트 코드, JITted 코드, 라이브러리의 원시 코드와 일치하는지 여부를 파악합니다. 이를 위해 머신 코드의 어떤 주소가 바이트 코드의 어떤 명령어와 일치 하는지를 알려주는 테이블을 참조합니다 (그리고 그 정보가 클래스 파일에서 중요하다면 소스 라인으로 되돌아갑니다). 이 테이블은 JITted 코드의 특정 위치가 둘 이상의 Java 레벨 스택 프레임에 해당 할 수 있음을 완벽하게 지정할 수 있습니다.

그러나 JVM이 이 필요하지 않습니다. 또한 단순히 스택 추적을 구성하여 신비한 휴식을 취하도록 선택할 수도 있습니다. javadoc for Throwable.getStackTrace()을 참조하십시오. (JVM이 스택 트레이스 을 전혀 생성 할 수 없다는 요구 조건이 전혀 없습니다.).

3

당신은 예외 처리는 JVM에서 작동 방법을 설명 this document을 확인 할 수 있습니다 :

캐치 예외가와 함께 클래스 파일로 제공 입니다 예외 테이블과 관련된

각 방법 바이트 코드 시퀀스는 입니다. 예외 테이블에는 각 예외에 대해 하나의 항목이 있으며 각 try 블록에 의해 catch 된 입니다. 각 엔트리에는 시작 및 종료 지점, 바이트 코드 시퀀스 내의 점프하는 pc 오프셋 및 예외 클래스의 상수 풀 인덱스 의 네 가지 정보가 있습니다.

+0

나는 그것을 조사하는 데 관심이있을 것이다. 하지만 특별히 인라인과 예외의 상호 작용에 대해 묻고있었습니다. 함수가 인라인 된 경우 스택 추적 정보가 없어야하지만 Java 프로그램에없는 것처럼 보입니다. – Gravity

+1

Java에서의 인라인은 C/C++와 같이 컴파일 타임이 아닌 런타임에서 이루어 지므로 어떤 정보도 잃어 버리지는 않습니다. 최적화 된 모든 정보는 검색/점프 테이블에 저장 될 수 있습니다. –

+0

특히 ArrayIndexOutOfBounds와 같은 매우 일반적인 예외의 경우 조회 테이블에 예외 정보를 저장하면 성능이 용납되지 않을까요? – Gravity

관련 문제