JDK-6935821 : G1: threads created during marking do not active their SATB queues
  • Type: Bug
  • Component: hotspot
  • Sub-Component: gc
  • Affected Version: hs17,hs18
  • Priority: P2
  • Status: Closed
  • Resolution: Fixed
  • OS: generic
  • CPU: generic
  • Submitted: 2010-03-17
  • Updated: 2013-09-18
  • Resolved: 2011-04-23
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
6u21Fixed 7Fixed hs17Fixed
Related Reports
Relates :  
Relates :  
Relates :  
When a thread is created, its SATB queue is always is initialized with the active field set to false. If a thread is created during a concurrent marking phase, this will cause all updates done by that thread not to be enqueued on SATB buffers. This can result in incomplete marking issues.

We have investigating marking issues in G1 as part of 6666145 and this is the one that's causing the most failures. See the Evaluation of that CR for a bit more info.

EVALUATION http://hg.openjdk.java.net/hsx/hsx17/master/rev/6a778ef9ee4f,ChangeRequest=6935821

EVALUATION http://hg.openjdk.java.net/hsx/hsx17/baseline/rev/6a778ef9ee4f,ChangeRequest=6935821

EVALUATION ChangeSet=http://hg.openjdk.java.net/jdk7/hotspot-gc/hotspot/rev/d4197f8d516a,ChangeRequest=6935821

EVALUATION See Description.

SUGGESTED FIX Make sure the active field of the SATB queues of newly-created threads is true if the thread is created during a marking cycle. One way to do this to read the active field from the SATB queue set with which the SATB queues are associated with. I also added asserts to the code that sets the active fields of the SATB queues to true / false at the start / end of a marking cycle to make sure that all queues have the same active value which matches what we expect.