>Java >java지도 시간 >Java 8에서는 재귀 깊이가 비결정적이지만 OpenJDK 7에서는 결정적인 이유는 무엇입니까?

Java 8에서는 재귀 깊이가 비결정적이지만 OpenJDK 7에서는 결정적인 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-10-29 06:16:30606검색

Why Is Recursion Depth Non-Deterministic in Java 8 but Deterministic in OpenJDK 7?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.