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

Shenandoah: Don't resurrect objects during evacuation on AS_NO_KEEPALIVE

    XMLWordPrintable

    Details

    • Subcomponent:
    • Resolved In Build:
      b24
    • CPU:
      generic
    • OS:
      generic

      Description

      In Shenandoah-testing, we noticed that compiler/jsr292/CallSiteDepContextTest.java fails with the following error:

      Internal Error (/home/rkennke/src/openjdk/jdk/src/hotspot/share/gc/shenandoah/shenandoahVerifier.cpp:92), pid=906849, tid=907073
      Error: Before Updating References, Marked; Must be marked in complete bitmap

      Referenced from:
        interior location: 0x00000000fff87504
        0x00000000fff874f8 - klass 0x000000010004ecd8 java.lang.invoke.MutableCallSite
              allocated after mark start
          not after update watermark
              marked strong
              marked weak
          not in collection set
        mark: mark(is_neutral no_hash age=0)
        region: | 2565|R |BTE fff80000, fffc0000, fffc0000|TAMS fff80000|UWM fffc0000|U 256K|T 0B|G 256K|S 0B|L 0B|CP 0

      Object:
        0x00000000d80a9210 - klass 0x000000010004cf58 java.lang.invoke.DirectMethodHandle
          not allocated after mark start
          not after update watermark
          not marked strong
          not marked weak
              in collection set
        mark: mark(is_neutral no_hash age=0)
        region: | 9|CS |BTE d8080000, d80c0000, d80c0000|TAMS d80c0000|UWM d80c0000|U 256K|T 256K|G 0B|S 0B|L 22464B|CP 0

      Forwardee:
        (the object itself)

      In other words, a reachable (marked) MutableCallSite references an unreachable DirectMethodHandle. That reference would subsequently become dangling and lead to crashes if accessed.

      I narrowed it down to the access in Dependencies::DepStream::recorded_oop_at(int i) which is done as 'strong', which means that it would return the reference even if it is unreachable, e.g. during concurrent class-unloading. This resurrection of the unreachable DMH is potentially fatal: eventually the reference will become dangling (after GC) and lead to crashes when accessed. I believe that access should be 'phantom' instead which causes GCs like Shenandoah and ZGC to return NULL when encountering unreachable objects.

        Attachments

          Issue Links

            Activity

              People

              Assignee:
              rkennke Roman Kennke
              Reporter:
              rkennke Roman Kennke
              Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

                Dates

                Created:
                Updated:
                Resolved: