JDK-6710665 : G1: guarantee(_cm->out_of_regions() && _cm->region_stack_empty() && _task_queue->size() == 0, ...)
  • Type: Bug
  • Component: hotspot
  • Sub-Component: gc
  • Affected Version: 7
  • Priority: P4
  • Status: Resolved
  • Resolution: Fixed
  • OS: generic
  • CPU: generic
  • Submitted: 2008-06-04
  • Updated: 2013-09-18
  • Resolved: 2008-10-07
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 6 JDK 7 Other
6u14Fixed 7Fixed hs14Fixed
G1 failed the guarantee while running GCBasher on T2000.

At concurrentMark.cpp:3783
Error: guarantee(_cm->out_of_regions() && _cm->region_stack_empty() && _task_queue->size() == 0,"only way to reach here")

EVALUATION http://hg.openjdk.java.net/jdk7/hotspot-gc/hotspot/rev/afc1ce1efe66

SUGGESTED FIX The fix is to remove the guarantees as they are too strong. Here's an alternative that we might want to look at in the future. If we wanted to skip the push on the region stack, we could introduce a CM task-local region entry and store the last entry there instead pushing it on the stack there. When the CM task restarts, we have to make sure that we check that entry first before we pop any more entries from the region stack. This way we can leave the guarantees in.

EVALUATION _cm->region_stack_empty() can become not empty again because if some thread in aborting in CMTask::drain_region_stack() it will push a partially done region back.