2014-06-19 3 views
3

포크/조인 구현이 오버플로를 스택시킬시기를 결정하려고합니다.함수의 최대 스택 공간

나는 컴파일러가 함수가 컴파일 할 때 필요로하는 최대 스택 공간을 결정한다는 것을 안다. 따라서이 정보는 내 Java 코드의 .class 파일에서 사용할 수 있어야합니다. 그러나, 나는이 가치에 도달하는 방법을 알아낼 수 없습니다.

런타임에 인쇄하거나 다른 사람이 클래스 파일에서 찾을 수있는 곳을 알려줄 수 있습니까? gedit에서 모든 횡설수설이 있기 때문에 찾을 수없는 것 같습니다.

+2

'.class' 파일은 사람이 읽을 수있는 것이 아닙니다. 그것은 기계 코드입니다. 거기를 들여다 보지 마라. 또한 다음과 같은 정보가 도움이 될 것입니다. http://stackoverflow.com/a/20030999/2398375 –

+0

.class 파일을 실제로보고 싶다면 [javap] (http://docs.oracle.com/ javass/7/docs/technotes/tools/windows/javap.html) 해체를 제공합니다. – vandale

+0

문제점을 지원하는 다른 리소스 (이전 주석을 편집 할 수 없음) : http://www.oracle.com/technetwork/java/hotspotfaq -138619.html # threads_oom –

답변

2

JBE은 클래스 파일을 찾아보고 편집 할 수있는 유용한 도구입니다. 하나의 정보는 특정 방법에 대한 최대 스택 깊이를 보여줍니다. JBE가이 정보에 액세스 할 수있는 경우, 바이트 코드 파싱 라이브러리를 사용하려는 경우 JBE가이를 수행 할 수 있습니다.

3

메서드 호출로 인해 스택 오버플로가 발생하는지 확인하는 간단한 방법은 없습니다.

슬롯의 수를 결정할 수 있지만 메서드는 스택에 필요합니다. 실제로 필요한 바이트 수는 알려주지 않습니다.

Java 바이트 코드는 스택이 추상 "슬롯"으로 구성된 것처럼 처리되는 실제 스택의 추상화와 함께 작동합니다. 이 참조, 메소드 매개 변수 및 지역 변수는 모두 스택에서 하나 또는 두 개의 슬롯을 차지합니다 (길고 두 배는 두 개의 슬롯이 필요하고 나머지는 한 개의 슬롯으로 계산됩니다). 클래스 파일에서 얻을 수있는 정보입니다.

슬롯이 실제로 스택 메모리로 변환되는 방식과 실제로 JIT가 바이트 코드에서 실제로 생성하는 방식이 아직 없습니다. JIT는 (코드 불변 이동과 같은) 최적화를 수행 할 때 임시 변수를 추가 할 수도 있습니다.

또한 네이티브 메서드를 호출 할 때 호출에 걸리는 스택 메모리의 양을 알 수있는 방법이 없습니다.

현재 JRE, VM 및 플랫폼에 따라 크게 달라집니다. 실제 스택의 크기를 실제로 확인하기위한 간단한 빌드 인 메서드가 없기 때문에 스택을 얼마나 필요로하고 얼마나 사용할 수 있는지 결정하는 것은 비실용적입니다.

+0

동의해야합니다. JBE 도구를 사용해 보았지만 어려운 숫자는주지 않습니다. 나는 좀 더 일반적인 방식으로 나의 대답을 공식화 할 것이라고 생각한다. 정보 주셔서 감사합니다. 더 자세한 정보가있는 링크를 제공 할 수 있습니까? 나는 읽고 싶다! :) –

+1

@ChristopheDeTroyer 더티 세부 사항은 궁극적으로 http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html Java Virtual Machine 사양에 설명되어 있습니다. paricular intrest는 아마도 4 장 (클래스 파일 형식, 특히 4.7.3)과 바이트 코드 명령 집합 (6 장) 일 것입니다. 특정 질문에 대답하기 위해 인터넷상의 제 3자가 특정 주제에 대해 더 쉽게 (증류 된) 기사가있을 수 있습니다. – Durandal