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

G1: Double calls to register_concurrent_cycle_end()

    XMLWordPrintable

    Details

    • Type: Bug
    • Status: Closed
    • Priority: P4
    • Resolution: Won't Fix
    • Affects Version/s: 9
    • Fix Version/s: 9
    • Component/s: hotspot
    • Labels:
    • Subcomponent:
      gc

      Description

      When we abort a concurrent cycle due to a Full GC in G1 we call ConcurrentMark::abort(). That will set _has_aborted flag and then call register_concurrent_cycle_end().

      The concurrent marking thread will see the _has_aborted flag in its ConcurrentMarkThread::run() method, abort the execution and then call register_concurrent_cycle_end().

      Currently this works since the code inside register_concurrent_cycle_end() is guarded by _concurrent_cycle_started which it itself resets. So, the double calls will not necessarily result in too much extra work being done. But one of the things that register_concurrent_cycle_end() does is to call report_gc_end() on the concurrent GC tracer. That prevents further use of it for this GC. This means that inside the ConcurrentMarkThread::run() method we can not rely on the tracer.

      Removing the call to register_concurrent_cycle_end() in ConcurrentMark::abort() and relying on the call in ConcurrentMarkThread::run() seems to be a reasonable approach.

        Attachments

          Activity

            People

            Assignee:
            brutisso Bengt Rutisson (Inactive)
            Reporter:
            brutisso Bengt Rutisson (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Dates

              Created:
              Updated:
              Resolved: