자바 JVM이 예외를 던질 가능성이있는 메소드를 인라인하는 것이 가능한지 궁금합니다. 필자는 배열 접근을 가지고 있으며 따라서 ArrayIndexOutOfBoundsException
을 던질 가능성이있는 메소드와 같은 메소드를 인라인 할 수 있다고 가정합니다. 내가보기에 문제는 실제로 예외가 발생하면 메서드를 인라인했다면 적절한 스택 추적을 어떻게 표시합니까? 서로 다른 메소드가 서로 다른 머신에 인라인 될 수 있기 때문에 인라인으로 스택 트레이스 메커니즘을 깨지 않을 수 있습니까?예외를 throw하는 메서드는 어떻게 인라인 될 수 있습니까?
답변
당신이 생각하는 문제는 무엇입니까? 인라이닝을 수행하는 것은 JVM 자체이기 때문에 Throwable 객체에 설치할 스택 트레이스를 생성 할 때 어디에서 인라인되었는지 기억하고있는 것을 기억하지 못합니다.
예외가이 던져진 경우 이 생성되면 JVM은 CPU 스택을 걸어서 각 기계 스택 프레임이 해석 된 바이트 코드, JITted 코드, 라이브러리의 원시 코드와 일치하는지 여부를 파악합니다. 이를 위해 머신 코드의 어떤 주소가 바이트 코드의 어떤 명령어와 일치 하는지를 알려주는 테이블을 참조합니다 (그리고 그 정보가 클래스 파일에서 중요하다면 소스 라인으로 되돌아갑니다). 이 테이블은 JITted 코드의 특정 위치가 둘 이상의 Java 레벨 스택 프레임에 해당 할 수 있음을 완벽하게 지정할 수 있습니다.
그러나 JVM이 이 필요하지 않습니다. 또한 단순히 스택 추적을 구성하여 신비한 휴식을 취하도록 선택할 수도 있습니다. javadoc for Throwable.getStackTrace()을 참조하십시오. (JVM이 스택 트레이스 을 전혀 생성 할 수 없다는 요구 조건이 전혀 없습니다.).
당신은 예외 처리는 JVM에서 작동 방법을 설명 this document을 확인 할 수 있습니다 :
캐치 예외가와 함께 클래스 파일로 제공 입니다 예외 테이블과 관련된각 방법 바이트 코드 시퀀스는 입니다. 예외 테이블에는 각 예외에 대해 하나의 항목이 있으며 각 try 블록에 의해 catch 된 입니다. 각 엔트리에는 시작 및 종료 지점, 바이트 코드 시퀀스 내의 점프하는 pc 오프셋 및 예외 클래스의 상수 풀 인덱스 의 네 가지 정보가 있습니다.
나는 그것을 조사하는 데 관심이있을 것이다. 하지만 특별히 인라인과 예외의 상호 작용에 대해 묻고있었습니다. 함수가 인라인 된 경우 스택 추적 정보가 없어야하지만 Java 프로그램에없는 것처럼 보입니다. – Gravity
Java에서의 인라인은 C/C++와 같이 컴파일 타임이 아닌 런타임에서 이루어 지므로 어떤 정보도 잃어 버리지는 않습니다. 최적화 된 모든 정보는 검색/점프 테이블에 저장 될 수 있습니다. –
특히 ArrayIndexOutOfBounds와 같은 매우 일반적인 예외의 경우 조회 테이블에 예외 정보를 저장하면 성능이 용납되지 않을까요? – Gravity
- 1. statment 예외를 throw하는 방법?
- 2. 제거하는 동안 예외를 throw하는 설치를 어떻게 제거합니까?
- 3. 인증 클래스가 throw하는 예외를 찾으십시오.
- 4. 예외를 throw하는 기본 UI 스레드 코드를 실행할 수 있습니까?
- 5. ObservableCollection이 수정 될 때 예외를 throw하는 이유는 무엇입니까?
- 6. .NET의 생성자에서 예외를 throw하는 중
- 7. Process.Exited 처리기에서 예외를 throw하는 중
- 8. CoerceValueCallback에서 예외를 throw하는 것이 적절합니까?
- 9. C에서 예외를 throw하는 방법은 무엇입니까?
- 10. enum 생성자에서 예외를 throw하는 방법?
- 11. ProcessMessages가 C++ 예외를 throw하는 이유는 무엇입니까?
- 12. ctor와 finalizer가 예외를 throw하는 C# 클래스의 모든 예외를 처리하려면 어떻게해야합니까?
- 13. 중복 메서드는 어떻게 찾을 수 있습니까?
- 14. 어떻게 Clojure에서 예외를 throw 할 수 있습니까?
- 15. Java 주 클래스에서 여러 예외를 throw하는 방법
- 16. Excel AddIn 디자이너 코드에서 예외를 throw하는 중
- 17. 전체 타당한 웹 응용 프로그램에서 타사 DLL이 보안 예외를 throw하는 것을 어떻게 막을 수 있습니까?
- 18. UIWebKit이 structuralComplexityContribution 예외를 throw하는 이유는 무엇입니까?
- 19. SQL Server가 예외를 계속 throw하는 이유는 무엇입니까?
- 20. 가상 함수에서 예외를 throw하는 것이 좋습니다.
- 21. Silverlight : BeginInvoke가 NotSupported 예외를 throw하는 이유는 무엇입니까?
- 22. Exception에서 상속받은 예외를 throw하는 방법은 무엇입니까?
- 23. 자바에서 컴파일 타임에 예외를 throw하는 방법
- 24. 새로운 rhino mocks에서 예외를 throw하는 방법 3.5
- 25. C++ 클래스의 생성자에서 예외를 throw하는 것이 좋습니다.
- 26. lVals = [1, 08, 2011]이 (가) 예외를 throw하는 이유가 있습니까?
- 27. 자바 스크립트가 인라인 될 좋은 이유가 있습니까
- 28. linq 예외를 throw하는 SQL 행을 찾을 수 없거나 변경되었습니다.
- 29. C# 컴파일러의 결함 : 항상 예외를 throw하는 메서드를 찾을 수 없음
- 30. SqlGeography.Reduce 메서드는 어떻게 작동합니까?
C++에서 인라인은 스택 정보 손실을 거의 보장합니다. 예외 스택 추적에 프레임이 누락되었다는 사실은 세상의 종말은 아닙니다. 이것은 인라이닝의 결과로 받아 들여지는 것입니다 (그리고 컴파일러가 모든 인라인을 억제하는 디버그 모드 옵션을 제공하는 이유 중 하나). 나는 자바가 똑같이 행동하는지 아닌지를 모른다. –
이 질문은 Java의 질문이지만, C++에서도 이것이 어떻게 작동하는지에 대해 흥미로운 내용이었습니다. – Gravity