RFR: Concurrent partial should not trash cset on cancellation path

Aleksey Shipilev shade at redhat.com
Fri Oct 13 10:06:10 UTC 2017


TestGCOldWithShenandoah fails after final-partial cancellation with:

#  Error: Shenandoah verification failed; Before Full GC, Reachable: Object should be in active region

Referenced from:
  interior location: 0x00000000f6287d9c
  0x00000000f6287d88 - klass 0x00000001000614e0 TreeNode
        allocated after complete mark start
        allocated after next mark start
        marked complete
        marked next
    not in collection set
  region: |0x00002b268408ad50|  906|R |BTE 0x00000000f6280000, 0x00000000f62c0000, ...

Object:
  0x00000000fa04e828 - klass 0x00000001000614e0 TreeNode
    not allocated after complete mark start
    not allocated after next mark start
    not marked complete
    not marked next
    not in collection set
  region: |0x00002b268409b3c0| 1153|T |BTE 0x00000000fa040000, 0x00000000fa080000, ...


This happens because current code manages to trash the cset regions on cancellation path, which
makes Full GC very unhappy: these trash regions may be zapped eagerly, making GC code crash -- we
have seen this happening before ShenandoahVerify configs were moved to be the first run
configuration in GCOld.

The solution is to rewire final_partial_collection() to exit without touching the cset:
  http://cr.openjdk.java.net/~shade/shenandoah/concpartial-cset-trash-cancel/webrev.01/

Testing: hotspot_gc_shenandoah (+ failing test)

Thanks,
-Aleksey



More information about the shenandoah-dev mailing list