Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8297727

Forcing LF interpretation lead to StackOverflowError in reflection code

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Unresolved
    • Icon: P4 P4
    • 25
    • 11, 24
    • core-libs
    • None

      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.

            liach Chen Liang
            redestad Claes Redestad
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated: