0N/A * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. 0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 0N/A * This code is free software; you can redistribute it and/or modify it 0N/A * under the terms of the GNU General Public License version 2 only, as 0N/A * published by the Free Software Foundation. 0N/A * This code is distributed in the hope that it will be useful, but WITHOUT 0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 0N/A * version 2 for more details (a copy is included in the LICENSE file that 0N/A * accompanied this code). 0N/A * You should have received a copy of the GNU General Public License version 0N/A * 2 along with this work; if not, write to the Free Software Foundation, 0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 0N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 0N/A// ======= Concurrent Mark Thread ======== 0N/A// The CM thread is created when the G1 garbage collector is used 0N/A // wait until started is set. 0N/A // We have to ensure that we finish scanning the root regions 0N/A // before the next GC takes place. To ensure this we have to 0N/A // make sure that we do not join the STS until the root regions 0N/A // have been scanned. If we did then it's possible that a 0N/A // subsequent GC could block us from joining the STS and proceed 0N/A // without the root regions have been scanned which would be a 0N/A // correctness issue. "in remark (restart #%d).",
iter);
// Update the total virtual time before doing this, since it will try // to measure it to get the vtime for this marking. We purposely // neglect the presumably-short "completeCleanup" phase here. // We don't want to update the marking status if a GC pause // Check if cleanup set the free_regions_coming flag. If it // hasn't, we can just skip the next step. // The following will finish freeing up any regions that we // found to be empty during cleanup. We'll do this part // without joining the suspendible set. If an evacuation pause // takes place, then we would carry on freeing regions in // case they are needed by the pause. If a Full GC takes // place, it would wait for us to process the regions // Now do the concurrent cleanup operation. // Notify anyone who's waiting that there are no more free // regions coming. We have to do this before we join the STS // (in fact, we should not attempt to join the STS in the // interval between finishing the cleanup pause and clearing // the free_regions_coming flag) otherwise we might deadlock: // a GC worker could be blocked waiting for the notification // whereas this thread will be blocked for the pause to finish // while it's trying to join the STS, which is conditional on // the GC workers finishing. "at this point there should be no regions on the cleanup list");
// There is a tricky race before recording that the concurrent // cleanup has completed and a potential Full GC starting around // the same time. We want to make sure that the Full GC calls // abort() on concurrent mark after // record_concurrent_mark_cleanup_completed(), since abort() is // the method that will reset the concurrent mark state. If we // end up calling record_concurrent_mark_cleanup_completed() // after abort() then we might incorrectly undo some of the work // abort() did. Checking the has_aborted() flag after joining // the STS allows the correct ordering of the two methods. There // a) If we reach here before the Full GC, the fact that we have // joined the STS means that the Full GC cannot start until we // leave the STS, so record_concurrent_mark_cleanup_completed() // will complete before abort() is called. // b) If we reach here during the Full GC, we'll be held up from // joining the STS until the Full GC is done, which means that // abort() will have completed and has_aborted() will return // true to prevent us from calling // record_concurrent_mark_cleanup_completed() (and, in fact, it's // not needed any more as the concurrent mark state has been // We now want to allow clearing of the marking bitmap to be // suspended by a collection pause. // Update the number of full collections that have been // completed. This will also notify the FullGCCount_lock in case a // Java thread is waiting for a full GC to happen (e.g., it // called System.gc() with +ExplicitGCInvokesConcurrent). // it is ok to take late safepoints here, if needed st->
print(
"\"G1 Main Concurrent Mark GC Thread\" ");
// We join here because we don't want to do the "shouldConcurrentMark()" // below while the world is otherwise stopped. // Note: As is the case with CMS - this method, although exported // by the ConcurrentMarkThread, which is a non-JavaThread, can only // be called by a JavaThread. Currently this is done at vm creation // XXX Consider changing this in the future to allow the CM thread // itself to create this thread?