JDK-8297727 : Forcing LF interpretation lead to StackOverflowError in reflection code
  • Type: Bug
  • Component: core-libs
  • Sub-Component: java.lang.invoke
  • Affected Version: 11,24
  • Priority: P4
  • Status: Resolved
  • Resolution: Fixed
  • Submitted: 2022-11-28
  • Updated: 2025-05-08
  • Resolved: 2025-04-30
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 25
25 b21Fixed
Related Reports
Causes :  
Relates :  
Description
Running the microbenchmark MethodHandles.+baselineMH with -jvmArgs=-Djava.lang.invoke.MethodHandle.COMPILE_THRESHOLD=-1 results in a SOE:

Exception in thread "Thread-0" java.lang.InternalError: java.lang.StackOverflowError
	at java.base/jdk.internal.reflect.MethodHandleLongFieldAccessorImpl.getLong(MethodHandleLongFieldAccessorImpl.java:90)
	at java.base/java.lang.reflect.Field.getLong(Field.java:666)
	at java.base/java.io.ObjectStreamClass.getDeclaredSUID(ObjectStreamClass.java:1711)
	at java.base/java.io.ObjectStreamClass$2.run(ObjectStreamClass.java:395)
	at java.base/java.io.ObjectStreamClass$2.run(ObjectStreamClass.java:383)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:319)
	at java.base/java.io.ObjectStreamClass.<init>(ObjectStreamClass.java:383)
	at java.base/java.io.ObjectStreamClass$Caches$1.computeValue(ObjectStreamClass.java:109)
	at java.base/java.io.ObjectStreamClass$Caches$1.computeValue(ObjectStreamClass.java:106)
	at java.base/java.io.ClassCache$1.computeValue(ClassCache.java:73)
	at java.base/java.io.ClassCache$1.computeValue(ClassCache.java:70)
	at java.base/java.lang.ClassValue.getFromHashMap(ClassValue.java:229)
	at java.base/java.lang.ClassValue.getFromBackup(ClassValue.java:211)
	at java.base/java.lang.ClassValue.get(ClassValue.java:117)
	at java.base/java.io.ClassCache.get(ClassCache.java:84)
	at java.base/java.io.ObjectStreamClass.lookup(ObjectStreamClass.java:362)
	at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1149)
	at java.base/java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:358)
	at org.openjdk.jmh.runner.link.BinaryLinkClient.pushFrame(BinaryLinkClient.java:128)
	at org.openjdk.jmh.runner.link.BinaryLinkClient.access$000(BinaryLinkClient.java:52)
	at org.openjdk.jmh.runner.link.BinaryLinkClient$1.invoke(BinaryLinkClient.java:88)
	at jdk.proxy1/jdk.proxy1.$Proxy0.println(Unknown Source)
	at org.openjdk.jmh.runner.ForkedMain.hangup(ForkedMain.java:123)
	at org.openjdk.jmh.runner.ForkedMain$HangupThread.run(ForkedMain.java:159)
Caused by: java.lang.StackOverflowError
	at java.base/jdk.internal.reflect.MethodHandleLongFieldAccessorImpl.getLong(MethodHandleLongFieldAccessorImpl.java:81)
	... 23 more

Disabling the reflection use of direct method handles by adding -Djdk.reflect.useDirectMethodHandle=false allows the microbenchmark to run to completion with only LF interpretation. Possibly there's some latent bug in that reflection code path that cause a circular LF call that is short-circuited when the LF is compiled to bytecode right away.
Comments
Changeset: e36756b2 Branch: master Author: Chen Liang <liach@openjdk.org> Date: 2025-04-30 21:56:13 +0000 URL: https://git.openjdk.org/jdk/commit/e36756b264000fe2deb95ec8f68d1571fd7653f9
30-04-2025

The reproducer does not work on Java 8, but works on Java 11 with some grammatical changes. Marking 11 as an affected version.
24-04-2025

A pull request was submitted for review. Branch: master URL: https://git.openjdk.org/jdk/pull/24835 Date: 2025-04-23 22:39:40 +0000
23-04-2025