concurrentMarkThread.cpp revision 9057:143fe39b8533
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
41SurrogateLockerThread*
42     ConcurrentMarkThread::_slt = NULL;
43
44ConcurrentMarkThread::ConcurrentMarkThread(ConcurrentMark* cm) :
45  ConcurrentGCThread(),
46  _cm(cm),
47  _state(Idle),
48  _vtime_accum(0.0),
49  _vtime_mark_accum(0.0) {
50
51  set_name("G1 Main Marker");
52  create_and_start();
53}
54
55class CMCheckpointRootsFinalClosure: public VoidClosure {
56
57  ConcurrentMark* _cm;
58public:
59
60  CMCheckpointRootsFinalClosure(ConcurrentMark* cm) :
61    _cm(cm) {}
62
63  void do_void(){
64    _cm->checkpointRootsFinal(false); // !clear_all_soft_refs
65  }
66};
67
68class CMCleanUp: public VoidClosure {
69  ConcurrentMark* _cm;
70public:
71
72  CMCleanUp(ConcurrentMark* cm) :
73    _cm(cm) {}
74
75  void do_void(){
76    _cm->cleanup();
77  }
78};
79
80// We want to avoid that the logging from the concurrent thread is mixed
81// with the logging from a STW GC. So, if necessary join the STS to ensure
82// that the logging is done either before or after the STW logging.
83void ConcurrentMarkThread::cm_log(bool doit, bool join_sts, const char* fmt, ...) {
84  if (doit) {
85    SuspendibleThreadSetJoiner sts_joiner(join_sts);
86    va_list args;
87    va_start(args, fmt);
88    gclog_or_tty->gclog_stamp(cm()->concurrent_gc_id());
89    gclog_or_tty->vprint_cr(fmt, args);
90    va_end(args);
91  }
92}
93
94void ConcurrentMarkThread::run() {
95  initialize_in_thread();
96  _vtime_start = os::elapsedVTime();
97  wait_for_universe_init();
98
99  G1CollectedHeap* g1h = G1CollectedHeap::heap();
100  G1CollectorPolicy* g1_policy = g1h->g1_policy();
101  G1MMUTracker *mmu_tracker = g1_policy->mmu_tracker();
102  Thread *current_thread = Thread::current();
103
104  while (!_should_terminate) {
105    // wait until started is set.
106    sleepBeforeNextCycle();
107    if (_should_terminate) {
108      break;
109    }
110
111    {
112      ResourceMark rm;
113      HandleMark   hm;
114      double cycle_start = os::elapsedVTime();
115
116      // We have to ensure that we finish scanning the root regions
117      // before the next GC takes place. To ensure this we have to
118      // make sure that we do not join the STS until the root regions
119      // have been scanned. If we did then it's possible that a
120      // subsequent GC could block us from joining the STS and proceed
121      // without the root regions have been scanned which would be a
122      // correctness issue.
123
124      if (!cm()->has_aborted()) {
125        _cm->scanRootRegions();
126      }
127
128      double mark_start_sec = os::elapsedTime();
129      cm_log(G1Log::fine(), true, "[GC concurrent-mark-start]");
130
131      int iter = 0;
132      do {
133        iter++;
134        if (!cm()->has_aborted()) {
135          _cm->markFromRoots();
136        }
137
138        double mark_end_time = os::elapsedVTime();
139        double mark_end_sec = os::elapsedTime();
140        _vtime_mark_accum += (mark_end_time - cycle_start);
141        if (!cm()->has_aborted()) {
142          if (g1_policy->adaptive_young_list_length()) {
143            double now = os::elapsedTime();
144            double remark_prediction_ms = g1_policy->predict_remark_time_ms();
145            jlong sleep_time_ms = mmu_tracker->when_ms(now, remark_prediction_ms);
146            os::sleep(current_thread, sleep_time_ms, false);
147          }
148
149          cm_log(G1Log::fine(), true, "[GC concurrent-mark-end, %1.7lf secs]", mark_end_sec - mark_start_sec);
150
151          CMCheckpointRootsFinalClosure final_cl(_cm);
152          VM_CGC_Operation op(&final_cl, "GC remark", true /* needs_pll */);
153          VMThread::execute(&op);
154        }
155        if (cm()->restart_for_overflow()) {
156          cm_log(G1TraceMarkStackOverflow, true, "Restarting conc marking because of MS overflow in remark (restart #%d).", iter);
157          cm_log(G1Log::fine(), true, "[GC concurrent-mark-restart-for-overflow]");
158        }
159      } while (cm()->restart_for_overflow());
160
161      double end_time = os::elapsedVTime();
162      // Update the total virtual time before doing this, since it will try
163      // to measure it to get the vtime for this marking.  We purposely
164      // neglect the presumably-short "completeCleanup" phase here.
165      _vtime_accum = (end_time - _vtime_start);
166
167      if (!cm()->has_aborted()) {
168        if (g1_policy->adaptive_young_list_length()) {
169          double now = os::elapsedTime();
170          double cleanup_prediction_ms = g1_policy->predict_cleanup_time_ms();
171          jlong sleep_time_ms = mmu_tracker->when_ms(now, cleanup_prediction_ms);
172          os::sleep(current_thread, sleep_time_ms, false);
173        }
174
175        CMCleanUp cl_cl(_cm);
176        VM_CGC_Operation op(&cl_cl, "GC cleanup", false /* needs_pll */);
177        VMThread::execute(&op);
178      } else {
179        // We don't want to update the marking status if a GC pause
180        // is already underway.
181        SuspendibleThreadSetJoiner sts_join;
182        g1h->collector_state()->set_mark_in_progress(false);
183      }
184
185      // Check if cleanup set the free_regions_coming flag. If it
186      // hasn't, we can just skip the next step.
187      if (g1h->free_regions_coming()) {
188        // The following will finish freeing up any regions that we
189        // found to be empty during cleanup. We'll do this part
190        // without joining the suspendible set. If an evacuation pause
191        // takes place, then we would carry on freeing regions in
192        // case they are needed by the pause. If a Full GC takes
193        // place, it would wait for us to process the regions
194        // reclaimed by cleanup.
195
196        double cleanup_start_sec = os::elapsedTime();
197        cm_log(G1Log::fine(), false, "[GC concurrent-cleanup-start]");
198
199        // Now do the concurrent cleanup operation.
200        _cm->completeCleanup();
201
202        // Notify anyone who's waiting that there are no more free
203        // regions coming. We have to do this before we join the STS
204        // (in fact, we should not attempt to join the STS in the
205        // interval between finishing the cleanup pause and clearing
206        // the free_regions_coming flag) otherwise we might deadlock:
207        // a GC worker could be blocked waiting for the notification
208        // whereas this thread will be blocked for the pause to finish
209        // while it's trying to join the STS, which is conditional on
210        // the GC workers finishing.
211        g1h->reset_free_regions_coming();
212
213        double cleanup_end_sec = os::elapsedTime();
214        cm_log(G1Log::fine(), true, "[GC concurrent-cleanup-end, %1.7lf secs]", cleanup_end_sec - cleanup_start_sec);
215      }
216      guarantee(cm()->cleanup_list_is_empty(),
217                "at this point there should be no regions on the cleanup list");
218
219      // There is a tricky race before recording that the concurrent
220      // cleanup has completed and a potential Full GC starting around
221      // the same time. We want to make sure that the Full GC calls
222      // abort() on concurrent mark after
223      // record_concurrent_mark_cleanup_completed(), since abort() is
224      // the method that will reset the concurrent mark state. If we
225      // end up calling record_concurrent_mark_cleanup_completed()
226      // after abort() then we might incorrectly undo some of the work
227      // abort() did. Checking the has_aborted() flag after joining
228      // the STS allows the correct ordering of the two methods. There
229      // are two scenarios:
230      //
231      // a) If we reach here before the Full GC, the fact that we have
232      // joined the STS means that the Full GC cannot start until we
233      // leave the STS, so record_concurrent_mark_cleanup_completed()
234      // will complete before abort() is called.
235      //
236      // b) If we reach here during the Full GC, we'll be held up from
237      // joining the STS until the Full GC is done, which means that
238      // abort() will have completed and has_aborted() will return
239      // true to prevent us from calling
240      // record_concurrent_mark_cleanup_completed() (and, in fact, it's
241      // not needed any more as the concurrent mark state has been
242      // already reset).
243      {
244        SuspendibleThreadSetJoiner sts_join;
245        if (!cm()->has_aborted()) {
246          g1_policy->record_concurrent_mark_cleanup_completed();
247        } else {
248          cm_log(G1Log::fine(), false, "[GC concurrent-mark-abort]");
249        }
250      }
251
252      // We now want to allow clearing of the marking bitmap to be
253      // suspended by a collection pause.
254      // We may have aborted just before the remark. Do not bother clearing the
255      // bitmap then, as it has been done during mark abort.
256      if (!cm()->has_aborted()) {
257        _cm->clearNextBitmap();
258      } else {
259        assert(!G1VerifyBitmaps || _cm->nextMarkBitmapIsClear(), "Next mark bitmap must be clear");
260      }
261    }
262
263    // Update the number of full collections that have been
264    // completed. This will also notify the FullGCCount_lock in case a
265    // Java thread is waiting for a full GC to happen (e.g., it
266    // called System.gc() with +ExplicitGCInvokesConcurrent).
267    {
268      SuspendibleThreadSetJoiner sts_join;
269      g1h->increment_old_marking_cycles_completed(true /* concurrent */);
270      g1h->register_concurrent_cycle_end();
271    }
272  }
273  assert(_should_terminate, "just checking");
274
275  terminate();
276}
277
278void ConcurrentMarkThread::stop() {
279  {
280    MutexLockerEx ml(Terminator_lock);
281    _should_terminate = true;
282  }
283
284  {
285    MutexLockerEx ml(CGC_lock, Mutex::_no_safepoint_check_flag);
286    CGC_lock->notify_all();
287  }
288
289  {
290    MutexLockerEx ml(Terminator_lock);
291    while (!_has_terminated) {
292      Terminator_lock->wait();
293    }
294  }
295}
296
297void ConcurrentMarkThread::sleepBeforeNextCycle() {
298  // We join here because we don't want to do the "shouldConcurrentMark()"
299  // below while the world is otherwise stopped.
300  assert(!in_progress(), "should have been cleared");
301
302  MutexLockerEx x(CGC_lock, Mutex::_no_safepoint_check_flag);
303  while (!started() && !_should_terminate) {
304    CGC_lock->wait(Mutex::_no_safepoint_check_flag);
305  }
306
307  if (started()) {
308    set_in_progress();
309  }
310}
311
312// Note: As is the case with CMS - this method, although exported
313// by the ConcurrentMarkThread, which is a non-JavaThread, can only
314// be called by a JavaThread. Currently this is done at vm creation
315// time (post-vm-init) by the main/Primordial (Java)Thread.
316// XXX Consider changing this in the future to allow the CM thread
317// itself to create this thread?
318void ConcurrentMarkThread::makeSurrogateLockerThread(TRAPS) {
319  assert(UseG1GC, "SLT thread needed only for concurrent GC");
320  assert(THREAD->is_Java_thread(), "must be a Java thread");
321  assert(_slt == NULL, "SLT already created");
322  _slt = SurrogateLockerThread::make(THREAD);
323}
324