1  /*
   2  * Copyright (c) 2001, 2015, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #include "precompiled.hpp"
  26 #include "gc/g1/concurrentMarkThread.inline.hpp"
  27 #include "gc/g1/g1CollectedHeap.inline.hpp"
  28 #include "gc/g1/g1CollectorPolicy.hpp"
  29 #include "gc/g1/g1Log.hpp"
  30 #include "gc/g1/g1MMUTracker.hpp"
  31 #include "gc/g1/suspendibleThreadSet.hpp"
  32 #include "gc/g1/vm_operations_g1.hpp"
  33 #include "gc/shared/gcTrace.hpp"
  34 #include "memory/resourceArea.hpp"
  35 #include "runtime/vmThread.hpp"
  36 
  37 // ======= Concurrent Mark Thread ========
  38 
  39 // The CM thread is created when the G1 garbage collector is used
  40 
  41 SurrogateLockerThread*
  42      ConcurrentMarkThread::_slt = NULL;
  43 
  44 ConcurrentMarkThread::ConcurrentMarkThread(ConcurrentMark* cm) :
  45   ConcurrentGCThread(),
  46   _cm(cm),
  47   _started(false),
  48   _in_progress(false),
  49   _vtime_accum(0.0),
  50   _vtime_mark_accum(0.0) {
  51 
  52   set_name("G1 Main Marker");
  53   create_and_start();
  54 }
  55 
  56 class CMCheckpointRootsFinalClosure: public VoidClosure {
  57 
  58   ConcurrentMark* _cm;
  59 public:
  60 
  61   CMCheckpointRootsFinalClosure(ConcurrentMark* cm) :
  62     _cm(cm) {}
  63 
  64   void do_void(){
  65     _cm->checkpointRootsFinal(false); // !clear_all_soft_refs
  66   }
  67 };
  68 
  69 class CMCleanUp: public VoidClosure {
  70   ConcurrentMark* _cm;
  71 public:
  72 
  73   CMCleanUp(ConcurrentMark* cm) :
  74     _cm(cm) {}
  75 
  76   void do_void(){
  77     _cm->cleanup();
  78   }
  79 };
  80 
  81 // We want to avoid that the logging from the concurrent thread is mixed
  82 // with the logging from a STW GC. Join the STS to ensure that the logging
  83 // is done either before or after the STW logging.
  84 void ConcurrentMarkThread::cm_log(bool doit, const char* fmt, ...) {
  85   if (doit) {
  86     SuspendibleThreadSetJoiner sts_joiner;
  87     va_list args;
  88     va_start(args, fmt);
  89     gclog_or_tty->gclog_stamp(cm()->concurrent_gc_id());
  90     gclog_or_tty->vprint_cr(fmt, args);
  91     va_end(args);
  92   }
  93 }
  94 
  95 void ConcurrentMarkThread::run() {
  96   initialize_in_thread();
  97   _vtime_start = os::elapsedVTime();
  98   wait_for_universe_init();
  99 
 100   G1CollectedHeap* g1h = G1CollectedHeap::heap();
 101   G1CollectorPolicy* g1_policy = g1h->g1_policy();
 102   G1MMUTracker *mmu_tracker = g1_policy->mmu_tracker();
 103   Thread *current_thread = Thread::current();
 104 
 105   while (!_should_terminate) {
 106     // wait until started is set.
 107     sleepBeforeNextCycle();
 108     if (_should_terminate) {
 109       break;
 110     }
 111 
 112     {
 113       ResourceMark rm;
 114       HandleMark   hm;
 115       double cycle_start = os::elapsedVTime();
 116 
 117       // We have to ensure that we finish scanning the root regions
 118       // before the next GC takes place. To ensure this we have to
 119       // make sure that we do not join the STS until the root regions
 120       // have been scanned. If we did then it's possible that a
 121       // subsequent GC could block us from joining the STS and proceed
 122       // without the root regions have been scanned which would be a
 123       // correctness issue.
 124       // This means that we can not use the cm_log() method for the logging
 125       // regarding the root region scanning below.
 126 
 127       double scan_start = os::elapsedTime();
 128       if (!cm()->has_aborted()) {
 129         if (G1Log::fine()) {
 130           gclog_or_tty->gclog_stamp(cm()->concurrent_gc_id());
 131           gclog_or_tty->print_cr("[GC concurrent-root-region-scan-start]");
 132         }
 133 
 134         _cm->scanRootRegions();
 135 
 136         double scan_end = os::elapsedTime();
 137         if (G1Log::fine()) {
 138           gclog_or_tty->gclog_stamp(cm()->concurrent_gc_id());
 139           gclog_or_tty->print_cr("[GC concurrent-root-region-scan-end, %1.7lf secs]",
 140                                  scan_end - scan_start);
 141         }
 142       }
 143 
 144       double mark_start_sec = os::elapsedTime();
 145       cm_log(G1Log::fine(), "[GC concurrent-mark-start]");
 146 
 147       int iter = 0;
 148       do {
 149         iter++;
 150         if (!cm()->has_aborted()) {
 151           _cm->markFromRoots();
 152         }
 153 
 154         double mark_end_time = os::elapsedVTime();
 155         double mark_end_sec = os::elapsedTime();
 156         _vtime_mark_accum += (mark_end_time - cycle_start);
 157         if (!cm()->has_aborted()) {
 158           if (g1_policy->adaptive_young_list_length()) {
 159             double now = os::elapsedTime();
 160             double remark_prediction_ms = g1_policy->predict_remark_time_ms();
 161             jlong sleep_time_ms = mmu_tracker->when_ms(now, remark_prediction_ms);
 162             os::sleep(current_thread, sleep_time_ms, false);
 163           }
 164 
 165           cm_log(G1Log::fine(), "[GC concurrent-mark-end, %1.7lf secs]", mark_end_sec - mark_start_sec);
 166 
 167           CMCheckpointRootsFinalClosure final_cl(_cm);
 168           VM_CGC_Operation op(&final_cl, "GC remark", true /* needs_pll */);
 169           VMThread::execute(&op);
 170         }
 171         if (cm()->restart_for_overflow()) {
 172           cm_log(G1TraceMarkStackOverflow, "Restarting conc marking because of MS overflow in remark (restart #%d).", iter);
 173           cm_log(G1Log::fine(), "[GC concurrent-mark-restart-for-overflow]");
 174         }
 175       } while (cm()->restart_for_overflow());
 176 
 177       double end_time = os::elapsedVTime();
 178       // Update the total virtual time before doing this, since it will try
 179       // to measure it to get the vtime for this marking.  We purposely
 180       // neglect the presumably-short "completeCleanup" phase here.
 181       _vtime_accum = (end_time - _vtime_start);
 182 
 183       if (!cm()->has_aborted()) {
 184         if (g1_policy->adaptive_young_list_length()) {
 185           double now = os::elapsedTime();
 186           double cleanup_prediction_ms = g1_policy->predict_cleanup_time_ms();
 187           jlong sleep_time_ms = mmu_tracker->when_ms(now, cleanup_prediction_ms);
 188           os::sleep(current_thread, sleep_time_ms, false);
 189         }
 190 
 191         CMCleanUp cl_cl(_cm);
 192         VM_CGC_Operation op(&cl_cl, "GC cleanup", false /* needs_pll */);
 193         VMThread::execute(&op);
 194       } else {
 195         // We don't want to update the marking status if a GC pause
 196         // is already underway.
 197         SuspendibleThreadSetJoiner sts_join;
 198         g1h->collector_state()->set_mark_in_progress(false);
 199       }
 200 
 201       // Check if cleanup set the free_regions_coming flag. If it
 202       // hasn't, we can just skip the next step.
 203       if (g1h->free_regions_coming()) {
 204         // The following will finish freeing up any regions that we
 205         // found to be empty during cleanup. We'll do this part
 206         // without joining the suspendible set. If an evacuation pause
 207         // takes place, then we would carry on freeing regions in
 208         // case they are needed by the pause. If a Full GC takes
 209         // place, it would wait for us to process the regions
 210         // reclaimed by cleanup.
 211 
 212         double cleanup_start_sec = os::elapsedTime();
 213         cm_log(G1Log::fine(), "[GC concurrent-cleanup-start]");
 214 
 215         // Now do the concurrent cleanup operation.
 216         _cm->completeCleanup();
 217 
 218         // Notify anyone who's waiting that there are no more free
 219         // regions coming. We have to do this before we join the STS
 220         // (in fact, we should not attempt to join the STS in the
 221         // interval between finishing the cleanup pause and clearing
 222         // the free_regions_coming flag) otherwise we might deadlock:
 223         // a GC worker could be blocked waiting for the notification
 224         // whereas this thread will be blocked for the pause to finish
 225         // while it's trying to join the STS, which is conditional on
 226         // the GC workers finishing.
 227         g1h->reset_free_regions_coming();
 228 
 229         double cleanup_end_sec = os::elapsedTime();
 230         cm_log(G1Log::fine(), "[GC concurrent-cleanup-end, %1.7lf secs]", cleanup_end_sec - cleanup_start_sec);
 231       }
 232       guarantee(cm()->cleanup_list_is_empty(),
 233                 "at this point there should be no regions on the cleanup list");
 234 
 235       // There is a tricky race before recording that the concurrent
 236       // cleanup has completed and a potential Full GC starting around
 237       // the same time. We want to make sure that the Full GC calls
 238       // abort() on concurrent mark after
 239       // record_concurrent_mark_cleanup_completed(), since abort() is
 240       // the method that will reset the concurrent mark state. If we
 241       // end up calling record_concurrent_mark_cleanup_completed()
 242       // after abort() then we might incorrectly undo some of the work
 243       // abort() did. Checking the has_aborted() flag after joining
 244       // the STS allows the correct ordering of the two methods. There
 245       // are two scenarios:
 246       //
 247       // a) If we reach here before the Full GC, the fact that we have
 248       // joined the STS means that the Full GC cannot start until we
 249       // leave the STS, so record_concurrent_mark_cleanup_completed()
 250       // will complete before abort() is called.
 251       //
 252       // b) If we reach here during the Full GC, we'll be held up from
 253       // joining the STS until the Full GC is done, which means that
 254       // abort() will have completed and has_aborted() will return
 255       // true to prevent us from calling
 256       // record_concurrent_mark_cleanup_completed() (and, in fact, it's
 257       // not needed any more as the concurrent mark state has been
 258       // already reset).
 259       {
 260         SuspendibleThreadSetJoiner sts_join;
 261         if (!cm()->has_aborted()) {
 262           g1_policy->record_concurrent_mark_cleanup_completed();
 263         } else {
 264           if (G1Log::fine()) {
 265             gclog_or_tty->gclog_stamp(cm()->concurrent_gc_id());
 266             gclog_or_tty->print_cr("[GC concurrent-mark-abort]");
 267           }
 268         }
 269       }
 270 
 271       // We now want to allow clearing of the marking bitmap to be
 272       // suspended by a collection pause.
 273       // We may have aborted just before the remark. Do not bother clearing the
 274       // bitmap then, as it has been done during mark abort.
 275       if (!cm()->has_aborted()) {
 276         _cm->clearNextBitmap();
 277       } else {
 278         assert(!G1VerifyBitmaps || _cm->nextMarkBitmapIsClear(), "Next mark bitmap must be clear");
 279       }
 280     }
 281 
 282     // Update the number of full collections that have been
 283     // completed. This will also notify the FullGCCount_lock in case a
 284     // Java thread is waiting for a full GC to happen (e.g., it
 285     // called System.gc() with +ExplicitGCInvokesConcurrent).
 286     {
 287       SuspendibleThreadSetJoiner sts_join;
 288       g1h->increment_old_marking_cycles_completed(true /* concurrent */);
 289       g1h->register_concurrent_cycle_end();
 290     }
 291   }
 292   assert(_should_terminate, "just checking");
 293 
 294   terminate();
 295 }
 296 
 297 void ConcurrentMarkThread::stop() {
 298   {
 299     MutexLockerEx ml(Terminator_lock);
 300     _should_terminate = true;
 301   }
 302 
 303   {
 304     MutexLockerEx ml(CGC_lock, Mutex::_no_safepoint_check_flag);
 305     CGC_lock->notify_all();
 306   }
 307 
 308   {
 309     MutexLockerEx ml(Terminator_lock);
 310     while (!_has_terminated) {
 311       Terminator_lock->wait();
 312     }
 313   }
 314 }
 315 
 316 void ConcurrentMarkThread::sleepBeforeNextCycle() {
 317   // We join here because we don't want to do the "shouldConcurrentMark()"
 318   // below while the world is otherwise stopped.
 319   assert(!in_progress(), "should have been cleared");
 320 
 321   MutexLockerEx x(CGC_lock, Mutex::_no_safepoint_check_flag);
 322   while (!started() && !_should_terminate) {
 323     CGC_lock->wait(Mutex::_no_safepoint_check_flag);
 324   }
 325 
 326   if (started()) {
 327     set_in_progress();
 328     clear_started();
 329   }
 330 }
 331 
 332 // Note: As is the case with CMS - this method, although exported
 333 // by the ConcurrentMarkThread, which is a non-JavaThread, can only
 334 // be called by a JavaThread. Currently this is done at vm creation
 335 // time (post-vm-init) by the main/Primordial (Java)Thread.
 336 // XXX Consider changing this in the future to allow the CM thread
 337 // itself to create this thread?
 338 void ConcurrentMarkThread::makeSurrogateLockerThread(TRAPS) {
 339   assert(UseG1GC, "SLT thread needed only for concurrent GC");
 340   assert(THREAD->is_Java_thread(), "must be a Java thread");
 341   assert(_slt == NULL, "SLT already created");
 342   _slt = SurrogateLockerThread::make(THREAD);
 343 }