Java 8의 비결정적 스택 깊이
Java의 최대 재귀 깊이를 결정하는 것은 스택 활용도와 잠재적인 메모리 문제를 이해하는 데 중요할 수 있습니다. . 그러나 Oracle의 Java 8에서는 보고된 결과가 비결정적일 수 있는 반면, OpenJDK 7에서는 일관된 결과를 제공합니다.
HotSpot Optimizer의 영향
HotSpot 컴파일러 최적화 프로그램은 관찰된 동작에 큰 영향을 미칩니다. 재귀 메서드가 JIT로 컴파일되면 최적화 프로그램은 특정 메서드 호출을 최적화하거나 여러 호출의 스택 프레임을 병합할 수 있습니다. 이러한 최적화로 인해 스택 공간 요구 사항이 더 작아지고 더 깊은 재귀가 가능해집니다.
예
다음 코드를 고려하세요.
<code class="java">public static int countDepth() { try { return 1+countDepth(); } catch(StackOverflowError err) { return 0; } }</code>
JIT가 포함된 결과(Oracle Java 8에서):
2097 4195 4195 4195 12587 12587 12587
JIT가 포함되지 않은 결과(Oracle Java 8에서):
2104 2104 2104 2104 2104 2104 2104
스택 제한 적용 및 ASLR
비결정성에 영향을 미치는 또 다른 요소는 JVM이 스택 제한을 적용하는 방식입니다. 스택 끝 주소에 특별한 정렬(예: 하드웨어 제한으로 인한 페이지 경계 정렬)이 필요한 경우 초기 스택 할당의 정렬 제약 조건이 더 약할 수 있습니다. ASLR(Address Space Layout Randomization)과 결합하면 사용 가능한 스택 공간의 양이 가변적으로 발생하여 비결정적 재귀 깊이가 발생할 수 있습니다.
OpenJDK 7의 결정성
Oracle의 Java 8과 달리 OpenJDK 7은 스택 제한을 보다 일관되게 적용하는 것으로 보이며 기본적으로 ASLR을 적용하지 않습니다. 이는 OpenJDK 7에서 관찰되는 결정적 동작을 설명합니다.
위 내용은 Java 8에서는 재귀 깊이가 비결정적이지만 OpenJDK 7에서는 결정적인 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!