src/share/vm/gc_implementation/g1/concurrentMark.cpp

Mon, 03 Aug 2009 12:59:30 -0700

author
johnc
date
Mon, 03 Aug 2009 12:59:30 -0700
changeset 1324
15c5903cf9e1
parent 1301
18f526145aea
child 1347
308762b2bf14
permissions
-rw-r--r--

6865703: G1: Parallelize hot card cache cleanup
Summary: Have the GC worker threads clear the hot card cache in parallel by having each worker thread claim a chunk of the card cache and process the cards in that chunk. The size of the chunks that each thread will claim is determined at VM initialization from the size of the card cache and the number of worker threads.
Reviewed-by: jmasa, tonyp

ysr@777 1 /*
xdono@1279 2 * Copyright 2001-2009 Sun Microsystems, Inc. All Rights Reserved.
ysr@777 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
ysr@777 4 *
ysr@777 5 * This code is free software; you can redistribute it and/or modify it
ysr@777 6 * under the terms of the GNU General Public License version 2 only, as
ysr@777 7 * published by the Free Software Foundation.
ysr@777 8 *
ysr@777 9 * This code is distributed in the hope that it will be useful, but WITHOUT
ysr@777 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
ysr@777 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
ysr@777 12 * version 2 for more details (a copy is included in the LICENSE file that
ysr@777 13 * accompanied this code).
ysr@777 14 *
ysr@777 15 * You should have received a copy of the GNU General Public License version
ysr@777 16 * 2 along with this work; if not, write to the Free Software Foundation,
ysr@777 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
ysr@777 18 *
ysr@777 19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
ysr@777 20 * CA 95054 USA or visit www.sun.com if you need additional information or
ysr@777 21 * have any questions.
ysr@777 22 *
ysr@777 23 */
ysr@777 24
ysr@777 25 #include "incls/_precompiled.incl"
ysr@777 26 #include "incls/_concurrentMark.cpp.incl"
ysr@777 27
ysr@777 28 //
ysr@777 29 // CMS Bit Map Wrapper
ysr@777 30
ysr@777 31 CMBitMapRO::CMBitMapRO(ReservedSpace rs, int shifter):
ysr@777 32 _bm((uintptr_t*)NULL,0),
ysr@777 33 _shifter(shifter) {
ysr@777 34 _bmStartWord = (HeapWord*)(rs.base());
ysr@777 35 _bmWordSize = rs.size()/HeapWordSize; // rs.size() is in bytes
ysr@777 36 ReservedSpace brs(ReservedSpace::allocation_align_size_up(
ysr@777 37 (_bmWordSize >> (_shifter + LogBitsPerByte)) + 1));
ysr@777 38
ysr@777 39 guarantee(brs.is_reserved(), "couldn't allocate CMS bit map");
ysr@777 40 // For now we'll just commit all of the bit map up fromt.
ysr@777 41 // Later on we'll try to be more parsimonious with swap.
ysr@777 42 guarantee(_virtual_space.initialize(brs, brs.size()),
ysr@777 43 "couldn't reseve backing store for CMS bit map");
ysr@777 44 assert(_virtual_space.committed_size() == brs.size(),
ysr@777 45 "didn't reserve backing store for all of CMS bit map?");
ysr@777 46 _bm.set_map((uintptr_t*)_virtual_space.low());
ysr@777 47 assert(_virtual_space.committed_size() << (_shifter + LogBitsPerByte) >=
ysr@777 48 _bmWordSize, "inconsistency in bit map sizing");
ysr@777 49 _bm.set_size(_bmWordSize >> _shifter);
ysr@777 50 }
ysr@777 51
ysr@777 52 HeapWord* CMBitMapRO::getNextMarkedWordAddress(HeapWord* addr,
ysr@777 53 HeapWord* limit) const {
ysr@777 54 // First we must round addr *up* to a possible object boundary.
ysr@777 55 addr = (HeapWord*)align_size_up((intptr_t)addr,
ysr@777 56 HeapWordSize << _shifter);
ysr@777 57 size_t addrOffset = heapWordToOffset(addr);
ysr@777 58 if (limit == NULL) limit = _bmStartWord + _bmWordSize;
ysr@777 59 size_t limitOffset = heapWordToOffset(limit);
ysr@777 60 size_t nextOffset = _bm.get_next_one_offset(addrOffset, limitOffset);
ysr@777 61 HeapWord* nextAddr = offsetToHeapWord(nextOffset);
ysr@777 62 assert(nextAddr >= addr, "get_next_one postcondition");
ysr@777 63 assert(nextAddr == limit || isMarked(nextAddr),
ysr@777 64 "get_next_one postcondition");
ysr@777 65 return nextAddr;
ysr@777 66 }
ysr@777 67
ysr@777 68 HeapWord* CMBitMapRO::getNextUnmarkedWordAddress(HeapWord* addr,
ysr@777 69 HeapWord* limit) const {
ysr@777 70 size_t addrOffset = heapWordToOffset(addr);
ysr@777 71 if (limit == NULL) limit = _bmStartWord + _bmWordSize;
ysr@777 72 size_t limitOffset = heapWordToOffset(limit);
ysr@777 73 size_t nextOffset = _bm.get_next_zero_offset(addrOffset, limitOffset);
ysr@777 74 HeapWord* nextAddr = offsetToHeapWord(nextOffset);
ysr@777 75 assert(nextAddr >= addr, "get_next_one postcondition");
ysr@777 76 assert(nextAddr == limit || !isMarked(nextAddr),
ysr@777 77 "get_next_one postcondition");
ysr@777 78 return nextAddr;
ysr@777 79 }
ysr@777 80
ysr@777 81 int CMBitMapRO::heapWordDiffToOffsetDiff(size_t diff) const {
ysr@777 82 assert((diff & ((1 << _shifter) - 1)) == 0, "argument check");
ysr@777 83 return (int) (diff >> _shifter);
ysr@777 84 }
ysr@777 85
ysr@777 86 bool CMBitMapRO::iterate(BitMapClosure* cl, MemRegion mr) {
ysr@777 87 HeapWord* left = MAX2(_bmStartWord, mr.start());
ysr@777 88 HeapWord* right = MIN2(_bmStartWord + _bmWordSize, mr.end());
ysr@777 89 if (right > left) {
ysr@777 90 // Right-open interval [leftOffset, rightOffset).
ysr@777 91 return _bm.iterate(cl, heapWordToOffset(left), heapWordToOffset(right));
ysr@777 92 } else {
ysr@777 93 return true;
ysr@777 94 }
ysr@777 95 }
ysr@777 96
ysr@777 97 void CMBitMapRO::mostly_disjoint_range_union(BitMap* from_bitmap,
ysr@777 98 size_t from_start_index,
ysr@777 99 HeapWord* to_start_word,
ysr@777 100 size_t word_num) {
ysr@777 101 _bm.mostly_disjoint_range_union(from_bitmap,
ysr@777 102 from_start_index,
ysr@777 103 heapWordToOffset(to_start_word),
ysr@777 104 word_num);
ysr@777 105 }
ysr@777 106
ysr@777 107 #ifndef PRODUCT
ysr@777 108 bool CMBitMapRO::covers(ReservedSpace rs) const {
ysr@777 109 // assert(_bm.map() == _virtual_space.low(), "map inconsistency");
kvn@1080 110 assert(((size_t)_bm.size() * (size_t)(1 << _shifter)) == _bmWordSize,
ysr@777 111 "size inconsistency");
ysr@777 112 return _bmStartWord == (HeapWord*)(rs.base()) &&
ysr@777 113 _bmWordSize == rs.size()>>LogHeapWordSize;
ysr@777 114 }
ysr@777 115 #endif
ysr@777 116
ysr@777 117 void CMBitMap::clearAll() {
ysr@777 118 _bm.clear();
ysr@777 119 return;
ysr@777 120 }
ysr@777 121
ysr@777 122 void CMBitMap::markRange(MemRegion mr) {
ysr@777 123 mr.intersection(MemRegion(_bmStartWord, _bmWordSize));
ysr@777 124 assert(!mr.is_empty(), "unexpected empty region");
ysr@777 125 assert((offsetToHeapWord(heapWordToOffset(mr.end())) ==
ysr@777 126 ((HeapWord *) mr.end())),
ysr@777 127 "markRange memory region end is not card aligned");
ysr@777 128 // convert address range into offset range
ysr@777 129 _bm.at_put_range(heapWordToOffset(mr.start()),
ysr@777 130 heapWordToOffset(mr.end()), true);
ysr@777 131 }
ysr@777 132
ysr@777 133 void CMBitMap::clearRange(MemRegion mr) {
ysr@777 134 mr.intersection(MemRegion(_bmStartWord, _bmWordSize));
ysr@777 135 assert(!mr.is_empty(), "unexpected empty region");
ysr@777 136 // convert address range into offset range
ysr@777 137 _bm.at_put_range(heapWordToOffset(mr.start()),
ysr@777 138 heapWordToOffset(mr.end()), false);
ysr@777 139 }
ysr@777 140
ysr@777 141 MemRegion CMBitMap::getAndClearMarkedRegion(HeapWord* addr,
ysr@777 142 HeapWord* end_addr) {
ysr@777 143 HeapWord* start = getNextMarkedWordAddress(addr);
ysr@777 144 start = MIN2(start, end_addr);
ysr@777 145 HeapWord* end = getNextUnmarkedWordAddress(start);
ysr@777 146 end = MIN2(end, end_addr);
ysr@777 147 assert(start <= end, "Consistency check");
ysr@777 148 MemRegion mr(start, end);
ysr@777 149 if (!mr.is_empty()) {
ysr@777 150 clearRange(mr);
ysr@777 151 }
ysr@777 152 return mr;
ysr@777 153 }
ysr@777 154
ysr@777 155 CMMarkStack::CMMarkStack(ConcurrentMark* cm) :
ysr@777 156 _base(NULL), _cm(cm)
ysr@777 157 #ifdef ASSERT
ysr@777 158 , _drain_in_progress(false)
ysr@777 159 , _drain_in_progress_yields(false)
ysr@777 160 #endif
ysr@777 161 {}
ysr@777 162
ysr@777 163 void CMMarkStack::allocate(size_t size) {
ysr@777 164 _base = NEW_C_HEAP_ARRAY(oop, size);
ysr@777 165 if (_base == NULL)
ysr@777 166 vm_exit_during_initialization("Failed to allocate "
ysr@777 167 "CM region mark stack");
ysr@777 168 _index = 0;
ysr@777 169 // QQQQ cast ...
ysr@777 170 _capacity = (jint) size;
ysr@777 171 _oops_do_bound = -1;
ysr@777 172 NOT_PRODUCT(_max_depth = 0);
ysr@777 173 }
ysr@777 174
ysr@777 175 CMMarkStack::~CMMarkStack() {
ysr@777 176 if (_base != NULL) FREE_C_HEAP_ARRAY(oop, _base);
ysr@777 177 }
ysr@777 178
ysr@777 179 void CMMarkStack::par_push(oop ptr) {
ysr@777 180 while (true) {
ysr@777 181 if (isFull()) {
ysr@777 182 _overflow = true;
ysr@777 183 return;
ysr@777 184 }
ysr@777 185 // Otherwise...
ysr@777 186 jint index = _index;
ysr@777 187 jint next_index = index+1;
ysr@777 188 jint res = Atomic::cmpxchg(next_index, &_index, index);
ysr@777 189 if (res == index) {
ysr@777 190 _base[index] = ptr;
ysr@777 191 // Note that we don't maintain this atomically. We could, but it
ysr@777 192 // doesn't seem necessary.
ysr@777 193 NOT_PRODUCT(_max_depth = MAX2(_max_depth, next_index));
ysr@777 194 return;
ysr@777 195 }
ysr@777 196 // Otherwise, we need to try again.
ysr@777 197 }
ysr@777 198 }
ysr@777 199
ysr@777 200 void CMMarkStack::par_adjoin_arr(oop* ptr_arr, int n) {
ysr@777 201 while (true) {
ysr@777 202 if (isFull()) {
ysr@777 203 _overflow = true;
ysr@777 204 return;
ysr@777 205 }
ysr@777 206 // Otherwise...
ysr@777 207 jint index = _index;
ysr@777 208 jint next_index = index + n;
ysr@777 209 if (next_index > _capacity) {
ysr@777 210 _overflow = true;
ysr@777 211 return;
ysr@777 212 }
ysr@777 213 jint res = Atomic::cmpxchg(next_index, &_index, index);
ysr@777 214 if (res == index) {
ysr@777 215 for (int i = 0; i < n; i++) {
ysr@777 216 int ind = index + i;
ysr@777 217 assert(ind < _capacity, "By overflow test above.");
ysr@777 218 _base[ind] = ptr_arr[i];
ysr@777 219 }
ysr@777 220 NOT_PRODUCT(_max_depth = MAX2(_max_depth, next_index));
ysr@777 221 return;
ysr@777 222 }
ysr@777 223 // Otherwise, we need to try again.
ysr@777 224 }
ysr@777 225 }
ysr@777 226
ysr@777 227
ysr@777 228 void CMMarkStack::par_push_arr(oop* ptr_arr, int n) {
ysr@777 229 MutexLockerEx x(ParGCRareEvent_lock, Mutex::_no_safepoint_check_flag);
ysr@777 230 jint start = _index;
ysr@777 231 jint next_index = start + n;
ysr@777 232 if (next_index > _capacity) {
ysr@777 233 _overflow = true;
ysr@777 234 return;
ysr@777 235 }
ysr@777 236 // Otherwise.
ysr@777 237 _index = next_index;
ysr@777 238 for (int i = 0; i < n; i++) {
ysr@777 239 int ind = start + i;
ysr@777 240 guarantee(ind < _capacity, "By overflow test above.");
ysr@777 241 _base[ind] = ptr_arr[i];
ysr@777 242 }
ysr@777 243 }
ysr@777 244
ysr@777 245
ysr@777 246 bool CMMarkStack::par_pop_arr(oop* ptr_arr, int max, int* n) {
ysr@777 247 MutexLockerEx x(ParGCRareEvent_lock, Mutex::_no_safepoint_check_flag);
ysr@777 248 jint index = _index;
ysr@777 249 if (index == 0) {
ysr@777 250 *n = 0;
ysr@777 251 return false;
ysr@777 252 } else {
ysr@777 253 int k = MIN2(max, index);
ysr@777 254 jint new_ind = index - k;
ysr@777 255 for (int j = 0; j < k; j++) {
ysr@777 256 ptr_arr[j] = _base[new_ind + j];
ysr@777 257 }
ysr@777 258 _index = new_ind;
ysr@777 259 *n = k;
ysr@777 260 return true;
ysr@777 261 }
ysr@777 262 }
ysr@777 263
ysr@777 264
ysr@777 265 CMRegionStack::CMRegionStack() : _base(NULL) {}
ysr@777 266
ysr@777 267 void CMRegionStack::allocate(size_t size) {
ysr@777 268 _base = NEW_C_HEAP_ARRAY(MemRegion, size);
ysr@777 269 if (_base == NULL)
ysr@777 270 vm_exit_during_initialization("Failed to allocate "
ysr@777 271 "CM region mark stack");
ysr@777 272 _index = 0;
ysr@777 273 // QQQQ cast ...
ysr@777 274 _capacity = (jint) size;
ysr@777 275 }
ysr@777 276
ysr@777 277 CMRegionStack::~CMRegionStack() {
ysr@777 278 if (_base != NULL) FREE_C_HEAP_ARRAY(oop, _base);
ysr@777 279 }
ysr@777 280
ysr@777 281 void CMRegionStack::push(MemRegion mr) {
ysr@777 282 assert(mr.word_size() > 0, "Precondition");
ysr@777 283 while (true) {
ysr@777 284 if (isFull()) {
ysr@777 285 _overflow = true;
ysr@777 286 return;
ysr@777 287 }
ysr@777 288 // Otherwise...
ysr@777 289 jint index = _index;
ysr@777 290 jint next_index = index+1;
ysr@777 291 jint res = Atomic::cmpxchg(next_index, &_index, index);
ysr@777 292 if (res == index) {
ysr@777 293 _base[index] = mr;
ysr@777 294 return;
ysr@777 295 }
ysr@777 296 // Otherwise, we need to try again.
ysr@777 297 }
ysr@777 298 }
ysr@777 299
ysr@777 300 MemRegion CMRegionStack::pop() {
ysr@777 301 while (true) {
ysr@777 302 // Otherwise...
ysr@777 303 jint index = _index;
ysr@777 304
ysr@777 305 if (index == 0) {
ysr@777 306 return MemRegion();
ysr@777 307 }
ysr@777 308 jint next_index = index-1;
ysr@777 309 jint res = Atomic::cmpxchg(next_index, &_index, index);
ysr@777 310 if (res == index) {
ysr@777 311 MemRegion mr = _base[next_index];
ysr@777 312 if (mr.start() != NULL) {
ysr@777 313 tmp_guarantee_CM( mr.end() != NULL, "invariant" );
ysr@777 314 tmp_guarantee_CM( mr.word_size() > 0, "invariant" );
ysr@777 315 return mr;
ysr@777 316 } else {
ysr@777 317 // that entry was invalidated... let's skip it
ysr@777 318 tmp_guarantee_CM( mr.end() == NULL, "invariant" );
ysr@777 319 }
ysr@777 320 }
ysr@777 321 // Otherwise, we need to try again.
ysr@777 322 }
ysr@777 323 }
ysr@777 324
ysr@777 325 bool CMRegionStack::invalidate_entries_into_cset() {
ysr@777 326 bool result = false;
ysr@777 327 G1CollectedHeap* g1h = G1CollectedHeap::heap();
ysr@777 328 for (int i = 0; i < _oops_do_bound; ++i) {
ysr@777 329 MemRegion mr = _base[i];
ysr@777 330 if (mr.start() != NULL) {
ysr@777 331 tmp_guarantee_CM( mr.end() != NULL, "invariant");
ysr@777 332 tmp_guarantee_CM( mr.word_size() > 0, "invariant" );
ysr@777 333 HeapRegion* hr = g1h->heap_region_containing(mr.start());
ysr@777 334 tmp_guarantee_CM( hr != NULL, "invariant" );
ysr@777 335 if (hr->in_collection_set()) {
ysr@777 336 // The region points into the collection set
ysr@777 337 _base[i] = MemRegion();
ysr@777 338 result = true;
ysr@777 339 }
ysr@777 340 } else {
ysr@777 341 // that entry was invalidated... let's skip it
ysr@777 342 tmp_guarantee_CM( mr.end() == NULL, "invariant" );
ysr@777 343 }
ysr@777 344 }
ysr@777 345 return result;
ysr@777 346 }
ysr@777 347
ysr@777 348 template<class OopClosureClass>
ysr@777 349 bool CMMarkStack::drain(OopClosureClass* cl, CMBitMap* bm, bool yield_after) {
ysr@777 350 assert(!_drain_in_progress || !_drain_in_progress_yields || yield_after
ysr@777 351 || SafepointSynchronize::is_at_safepoint(),
ysr@777 352 "Drain recursion must be yield-safe.");
ysr@777 353 bool res = true;
ysr@777 354 debug_only(_drain_in_progress = true);
ysr@777 355 debug_only(_drain_in_progress_yields = yield_after);
ysr@777 356 while (!isEmpty()) {
ysr@777 357 oop newOop = pop();
ysr@777 358 assert(G1CollectedHeap::heap()->is_in_reserved(newOop), "Bad pop");
ysr@777 359 assert(newOop->is_oop(), "Expected an oop");
ysr@777 360 assert(bm == NULL || bm->isMarked((HeapWord*)newOop),
ysr@777 361 "only grey objects on this stack");
ysr@777 362 // iterate over the oops in this oop, marking and pushing
ysr@777 363 // the ones in CMS generation.
ysr@777 364 newOop->oop_iterate(cl);
ysr@777 365 if (yield_after && _cm->do_yield_check()) {
ysr@777 366 res = false; break;
ysr@777 367 }
ysr@777 368 }
ysr@777 369 debug_only(_drain_in_progress = false);
ysr@777 370 return res;
ysr@777 371 }
ysr@777 372
ysr@777 373 void CMMarkStack::oops_do(OopClosure* f) {
ysr@777 374 if (_index == 0) return;
ysr@777 375 assert(_oops_do_bound != -1 && _oops_do_bound <= _index,
ysr@777 376 "Bound must be set.");
ysr@777 377 for (int i = 0; i < _oops_do_bound; i++) {
ysr@777 378 f->do_oop(&_base[i]);
ysr@777 379 }
ysr@777 380 _oops_do_bound = -1;
ysr@777 381 }
ysr@777 382
ysr@777 383 bool ConcurrentMark::not_yet_marked(oop obj) const {
ysr@777 384 return (_g1h->is_obj_ill(obj)
ysr@777 385 || (_g1h->is_in_permanent(obj)
ysr@777 386 && !nextMarkBitMap()->isMarked((HeapWord*)obj)));
ysr@777 387 }
ysr@777 388
ysr@777 389 #ifdef _MSC_VER // the use of 'this' below gets a warning, make it go away
ysr@777 390 #pragma warning( disable:4355 ) // 'this' : used in base member initializer list
ysr@777 391 #endif // _MSC_VER
ysr@777 392
ysr@777 393 ConcurrentMark::ConcurrentMark(ReservedSpace rs,
ysr@777 394 int max_regions) :
ysr@777 395 _markBitMap1(rs, MinObjAlignment - 1),
ysr@777 396 _markBitMap2(rs, MinObjAlignment - 1),
ysr@777 397
ysr@777 398 _parallel_marking_threads(0),
ysr@777 399 _sleep_factor(0.0),
ysr@777 400 _marking_task_overhead(1.0),
ysr@777 401 _cleanup_sleep_factor(0.0),
ysr@777 402 _cleanup_task_overhead(1.0),
ysr@777 403 _region_bm(max_regions, false /* in_resource_area*/),
ysr@777 404 _card_bm((rs.size() + CardTableModRefBS::card_size - 1) >>
ysr@777 405 CardTableModRefBS::card_shift,
ysr@777 406 false /* in_resource_area*/),
ysr@777 407 _prevMarkBitMap(&_markBitMap1),
ysr@777 408 _nextMarkBitMap(&_markBitMap2),
ysr@777 409 _at_least_one_mark_complete(false),
ysr@777 410
ysr@777 411 _markStack(this),
ysr@777 412 _regionStack(),
ysr@777 413 // _finger set in set_non_marking_state
ysr@777 414
ysr@777 415 _max_task_num(MAX2(ParallelGCThreads, (size_t)1)),
ysr@777 416 // _active_tasks set in set_non_marking_state
ysr@777 417 // _tasks set inside the constructor
ysr@777 418 _task_queues(new CMTaskQueueSet((int) _max_task_num)),
ysr@777 419 _terminator(ParallelTaskTerminator((int) _max_task_num, _task_queues)),
ysr@777 420
ysr@777 421 _has_overflown(false),
ysr@777 422 _concurrent(false),
tonyp@1054 423 _has_aborted(false),
tonyp@1054 424 _restart_for_overflow(false),
tonyp@1054 425 _concurrent_marking_in_progress(false),
tonyp@1054 426 _should_gray_objects(false),
ysr@777 427
ysr@777 428 // _verbose_level set below
ysr@777 429
ysr@777 430 _init_times(),
ysr@777 431 _remark_times(), _remark_mark_times(), _remark_weak_ref_times(),
ysr@777 432 _cleanup_times(),
ysr@777 433 _total_counting_time(0.0),
ysr@777 434 _total_rs_scrub_time(0.0),
ysr@777 435
ysr@777 436 _parallel_workers(NULL),
ysr@777 437 _cleanup_co_tracker(G1CLGroup)
ysr@777 438 {
ysr@777 439 CMVerboseLevel verbose_level =
ysr@777 440 (CMVerboseLevel) G1MarkingVerboseLevel;
ysr@777 441 if (verbose_level < no_verbose)
ysr@777 442 verbose_level = no_verbose;
ysr@777 443 if (verbose_level > high_verbose)
ysr@777 444 verbose_level = high_verbose;
ysr@777 445 _verbose_level = verbose_level;
ysr@777 446
ysr@777 447 if (verbose_low())
ysr@777 448 gclog_or_tty->print_cr("[global] init, heap start = "PTR_FORMAT", "
ysr@777 449 "heap end = "PTR_FORMAT, _heap_start, _heap_end);
ysr@777 450
johnc@1186 451 _markStack.allocate(G1MarkStackSize);
johnc@1186 452 _regionStack.allocate(G1MarkRegionStackSize);
ysr@777 453
ysr@777 454 // Create & start a ConcurrentMark thread.
ysr@1280 455 _cmThread = new ConcurrentMarkThread(this);
ysr@1280 456 assert(cmThread() != NULL, "CM Thread should have been created");
ysr@1280 457 assert(cmThread()->cm() != NULL, "CM Thread should refer to this cm");
ysr@1280 458
ysr@777 459 _g1h = G1CollectedHeap::heap();
ysr@777 460 assert(CGC_lock != NULL, "Where's the CGC_lock?");
ysr@777 461 assert(_markBitMap1.covers(rs), "_markBitMap1 inconsistency");
ysr@777 462 assert(_markBitMap2.covers(rs), "_markBitMap2 inconsistency");
ysr@777 463
ysr@777 464 SATBMarkQueueSet& satb_qs = JavaThread::satb_mark_queue_set();
ysr@777 465 satb_qs.set_buffer_size(G1SATBLogBufferSize);
ysr@777 466
ysr@777 467 int size = (int) MAX2(ParallelGCThreads, (size_t)1);
ysr@777 468 _par_cleanup_thread_state = NEW_C_HEAP_ARRAY(ParCleanupThreadState*, size);
ysr@777 469 for (int i = 0 ; i < size; i++) {
ysr@777 470 _par_cleanup_thread_state[i] = new ParCleanupThreadState;
ysr@777 471 }
ysr@777 472
ysr@777 473 _tasks = NEW_C_HEAP_ARRAY(CMTask*, _max_task_num);
ysr@777 474 _accum_task_vtime = NEW_C_HEAP_ARRAY(double, _max_task_num);
ysr@777 475
ysr@777 476 // so that the assertion in MarkingTaskQueue::task_queue doesn't fail
ysr@777 477 _active_tasks = _max_task_num;
ysr@777 478 for (int i = 0; i < (int) _max_task_num; ++i) {
ysr@777 479 CMTaskQueue* task_queue = new CMTaskQueue();
ysr@777 480 task_queue->initialize();
ysr@777 481 _task_queues->register_queue(i, task_queue);
ysr@777 482
ysr@777 483 _tasks[i] = new CMTask(i, this, task_queue, _task_queues);
ysr@777 484 _accum_task_vtime[i] = 0.0;
ysr@777 485 }
ysr@777 486
ysr@777 487 if (ParallelMarkingThreads > ParallelGCThreads) {
ysr@777 488 vm_exit_during_initialization("Can't have more ParallelMarkingThreads "
ysr@777 489 "than ParallelGCThreads.");
ysr@777 490 }
ysr@777 491 if (ParallelGCThreads == 0) {
ysr@777 492 // if we are not running with any parallel GC threads we will not
ysr@777 493 // spawn any marking threads either
ysr@777 494 _parallel_marking_threads = 0;
ysr@777 495 _sleep_factor = 0.0;
ysr@777 496 _marking_task_overhead = 1.0;
ysr@777 497 } else {
ysr@777 498 if (ParallelMarkingThreads > 0) {
johnc@1186 499 // notice that ParallelMarkingThreads overwrites G1MarkingOverheadPercent
ysr@777 500 // if both are set
ysr@777 501
ysr@777 502 _parallel_marking_threads = ParallelMarkingThreads;
ysr@777 503 _sleep_factor = 0.0;
ysr@777 504 _marking_task_overhead = 1.0;
johnc@1186 505 } else if (G1MarkingOverheadPercent > 0) {
ysr@777 506 // we will calculate the number of parallel marking threads
ysr@777 507 // based on a target overhead with respect to the soft real-time
ysr@777 508 // goal
ysr@777 509
johnc@1186 510 double marking_overhead = (double) G1MarkingOverheadPercent / 100.0;
ysr@777 511 double overall_cm_overhead =
johnc@1186 512 (double) MaxGCPauseMillis * marking_overhead /
johnc@1186 513 (double) GCPauseIntervalMillis;
ysr@777 514 double cpu_ratio = 1.0 / (double) os::processor_count();
ysr@777 515 double marking_thread_num = ceil(overall_cm_overhead / cpu_ratio);
ysr@777 516 double marking_task_overhead =
ysr@777 517 overall_cm_overhead / marking_thread_num *
ysr@777 518 (double) os::processor_count();
ysr@777 519 double sleep_factor =
ysr@777 520 (1.0 - marking_task_overhead) / marking_task_overhead;
ysr@777 521
ysr@777 522 _parallel_marking_threads = (size_t) marking_thread_num;
ysr@777 523 _sleep_factor = sleep_factor;
ysr@777 524 _marking_task_overhead = marking_task_overhead;
ysr@777 525 } else {
ysr@777 526 _parallel_marking_threads = MAX2((ParallelGCThreads + 2) / 4, (size_t)1);
ysr@777 527 _sleep_factor = 0.0;
ysr@777 528 _marking_task_overhead = 1.0;
ysr@777 529 }
ysr@777 530
ysr@777 531 if (parallel_marking_threads() > 1)
ysr@777 532 _cleanup_task_overhead = 1.0;
ysr@777 533 else
ysr@777 534 _cleanup_task_overhead = marking_task_overhead();
ysr@777 535 _cleanup_sleep_factor =
ysr@777 536 (1.0 - cleanup_task_overhead()) / cleanup_task_overhead();
ysr@777 537
ysr@777 538 #if 0
ysr@777 539 gclog_or_tty->print_cr("Marking Threads %d", parallel_marking_threads());
ysr@777 540 gclog_or_tty->print_cr("CM Marking Task Overhead %1.4lf", marking_task_overhead());
ysr@777 541 gclog_or_tty->print_cr("CM Sleep Factor %1.4lf", sleep_factor());
ysr@777 542 gclog_or_tty->print_cr("CL Marking Task Overhead %1.4lf", cleanup_task_overhead());
ysr@777 543 gclog_or_tty->print_cr("CL Sleep Factor %1.4lf", cleanup_sleep_factor());
ysr@777 544 #endif
ysr@777 545
ysr@777 546 guarantee( parallel_marking_threads() > 0, "peace of mind" );
ysr@777 547 _parallel_workers = new WorkGang("Parallel Marking Threads",
ysr@777 548 (int) parallel_marking_threads(), false, true);
ysr@777 549 if (_parallel_workers == NULL)
ysr@777 550 vm_exit_during_initialization("Failed necessary allocation.");
ysr@777 551 }
ysr@777 552
ysr@777 553 // so that the call below can read a sensible value
ysr@777 554 _heap_start = (HeapWord*) rs.base();
ysr@777 555 set_non_marking_state();
ysr@777 556 }
ysr@777 557
ysr@777 558 void ConcurrentMark::update_g1_committed(bool force) {
ysr@777 559 // If concurrent marking is not in progress, then we do not need to
ysr@777 560 // update _heap_end. This has a subtle and important
ysr@777 561 // side-effect. Imagine that two evacuation pauses happen between
ysr@777 562 // marking completion and remark. The first one can grow the
ysr@777 563 // heap (hence now the finger is below the heap end). Then, the
ysr@777 564 // second one could unnecessarily push regions on the region
ysr@777 565 // stack. This causes the invariant that the region stack is empty
ysr@777 566 // at the beginning of remark to be false. By ensuring that we do
ysr@777 567 // not observe heap expansions after marking is complete, then we do
ysr@777 568 // not have this problem.
ysr@777 569 if (!concurrent_marking_in_progress() && !force)
ysr@777 570 return;
ysr@777 571
ysr@777 572 MemRegion committed = _g1h->g1_committed();
ysr@777 573 tmp_guarantee_CM( committed.start() == _heap_start,
ysr@777 574 "start shouldn't change" );
ysr@777 575 HeapWord* new_end = committed.end();
ysr@777 576 if (new_end > _heap_end) {
ysr@777 577 // The heap has been expanded.
ysr@777 578
ysr@777 579 _heap_end = new_end;
ysr@777 580 }
ysr@777 581 // Notice that the heap can also shrink. However, this only happens
ysr@777 582 // during a Full GC (at least currently) and the entire marking
ysr@777 583 // phase will bail out and the task will not be restarted. So, let's
ysr@777 584 // do nothing.
ysr@777 585 }
ysr@777 586
ysr@777 587 void ConcurrentMark::reset() {
ysr@777 588 // Starting values for these two. This should be called in a STW
ysr@777 589 // phase. CM will be notified of any future g1_committed expansions
ysr@777 590 // will be at the end of evacuation pauses, when tasks are
ysr@777 591 // inactive.
ysr@777 592 MemRegion committed = _g1h->g1_committed();
ysr@777 593 _heap_start = committed.start();
ysr@777 594 _heap_end = committed.end();
ysr@777 595
ysr@777 596 guarantee( _heap_start != NULL &&
ysr@777 597 _heap_end != NULL &&
ysr@777 598 _heap_start < _heap_end, "heap bounds should look ok" );
ysr@777 599
ysr@777 600 // reset all the marking data structures and any necessary flags
ysr@777 601 clear_marking_state();
ysr@777 602
ysr@777 603 if (verbose_low())
ysr@777 604 gclog_or_tty->print_cr("[global] resetting");
ysr@777 605
ysr@777 606 // We do reset all of them, since different phases will use
ysr@777 607 // different number of active threads. So, it's easiest to have all
ysr@777 608 // of them ready.
ysr@777 609 for (int i = 0; i < (int) _max_task_num; ++i)
ysr@777 610 _tasks[i]->reset(_nextMarkBitMap);
ysr@777 611
ysr@777 612 // we need this to make sure that the flag is on during the evac
ysr@777 613 // pause with initial mark piggy-backed
ysr@777 614 set_concurrent_marking_in_progress();
ysr@777 615 }
ysr@777 616
ysr@777 617 void ConcurrentMark::set_phase(size_t active_tasks, bool concurrent) {
ysr@777 618 guarantee( active_tasks <= _max_task_num, "we should not have more" );
ysr@777 619
ysr@777 620 _active_tasks = active_tasks;
ysr@777 621 // Need to update the three data structures below according to the
ysr@777 622 // number of active threads for this phase.
ysr@777 623 _terminator = ParallelTaskTerminator((int) active_tasks, _task_queues);
ysr@777 624 _first_overflow_barrier_sync.set_n_workers((int) active_tasks);
ysr@777 625 _second_overflow_barrier_sync.set_n_workers((int) active_tasks);
ysr@777 626
ysr@777 627 _concurrent = concurrent;
ysr@777 628 // We propagate this to all tasks, not just the active ones.
ysr@777 629 for (int i = 0; i < (int) _max_task_num; ++i)
ysr@777 630 _tasks[i]->set_concurrent(concurrent);
ysr@777 631
ysr@777 632 if (concurrent) {
ysr@777 633 set_concurrent_marking_in_progress();
ysr@777 634 } else {
ysr@777 635 // We currently assume that the concurrent flag has been set to
ysr@777 636 // false before we start remark. At this point we should also be
ysr@777 637 // in a STW phase.
ysr@777 638 guarantee( !concurrent_marking_in_progress(), "invariant" );
ysr@777 639 guarantee( _finger == _heap_end, "only way to get here" );
ysr@777 640 update_g1_committed(true);
ysr@777 641 }
ysr@777 642 }
ysr@777 643
ysr@777 644 void ConcurrentMark::set_non_marking_state() {
ysr@777 645 // We set the global marking state to some default values when we're
ysr@777 646 // not doing marking.
ysr@777 647 clear_marking_state();
ysr@777 648 _active_tasks = 0;
ysr@777 649 clear_concurrent_marking_in_progress();
ysr@777 650 }
ysr@777 651
ysr@777 652 ConcurrentMark::~ConcurrentMark() {
ysr@777 653 int size = (int) MAX2(ParallelGCThreads, (size_t)1);
ysr@777 654 for (int i = 0; i < size; i++) delete _par_cleanup_thread_state[i];
ysr@777 655 FREE_C_HEAP_ARRAY(ParCleanupThreadState*,
ysr@777 656 _par_cleanup_thread_state);
ysr@777 657
ysr@777 658 for (int i = 0; i < (int) _max_task_num; ++i) {
ysr@777 659 delete _task_queues->queue(i);
ysr@777 660 delete _tasks[i];
ysr@777 661 }
ysr@777 662 delete _task_queues;
ysr@777 663 FREE_C_HEAP_ARRAY(CMTask*, _max_task_num);
ysr@777 664 }
ysr@777 665
ysr@777 666 // This closure is used to mark refs into the g1 generation
ysr@777 667 // from external roots in the CMS bit map.
ysr@777 668 // Called at the first checkpoint.
ysr@777 669 //
ysr@777 670
ysr@777 671 #define PRINT_REACHABLE_AT_INITIAL_MARK 0
ysr@777 672 #if PRINT_REACHABLE_AT_INITIAL_MARK
ysr@777 673 static FILE* reachable_file = NULL;
ysr@777 674
ysr@777 675 class PrintReachableClosure: public OopsInGenClosure {
ysr@777 676 CMBitMap* _bm;
ysr@777 677 int _level;
ysr@777 678 public:
ysr@777 679 PrintReachableClosure(CMBitMap* bm) :
ysr@777 680 _bm(bm), _level(0) {
ysr@777 681 guarantee(reachable_file != NULL, "pre-condition");
ysr@777 682 }
ysr@777 683 void do_oop(oop* p) {
ysr@777 684 oop obj = *p;
ysr@777 685 HeapWord* obj_addr = (HeapWord*)obj;
ysr@777 686 if (obj == NULL) return;
ysr@777 687 fprintf(reachable_file, "%d: "PTR_FORMAT" -> "PTR_FORMAT" (%d)\n",
ysr@777 688 _level, p, (void*) obj, _bm->isMarked(obj_addr));
ysr@777 689 if (!_bm->isMarked(obj_addr)) {
ysr@777 690 _bm->mark(obj_addr);
ysr@777 691 _level++;
ysr@777 692 obj->oop_iterate(this);
ysr@777 693 _level--;
ysr@777 694 }
ysr@777 695 }
ysr@777 696 };
ysr@777 697 #endif // PRINT_REACHABLE_AT_INITIAL_MARK
ysr@777 698
ysr@777 699 #define SEND_HEAP_DUMP_TO_FILE 0
ysr@777 700 #if SEND_HEAP_DUMP_TO_FILE
ysr@777 701 static FILE* heap_dump_file = NULL;
ysr@777 702 #endif // SEND_HEAP_DUMP_TO_FILE
ysr@777 703
ysr@777 704 void ConcurrentMark::clearNextBitmap() {
ysr@777 705 guarantee(!G1CollectedHeap::heap()->mark_in_progress(), "Precondition.");
ysr@777 706
ysr@777 707 // clear the mark bitmap (no grey objects to start with).
ysr@777 708 // We need to do this in chunks and offer to yield in between
ysr@777 709 // each chunk.
ysr@777 710 HeapWord* start = _nextMarkBitMap->startWord();
ysr@777 711 HeapWord* end = _nextMarkBitMap->endWord();
ysr@777 712 HeapWord* cur = start;
ysr@777 713 size_t chunkSize = M;
ysr@777 714 while (cur < end) {
ysr@777 715 HeapWord* next = cur + chunkSize;
ysr@777 716 if (next > end)
ysr@777 717 next = end;
ysr@777 718 MemRegion mr(cur,next);
ysr@777 719 _nextMarkBitMap->clearRange(mr);
ysr@777 720 cur = next;
ysr@777 721 do_yield_check();
ysr@777 722 }
ysr@777 723 }
ysr@777 724
ysr@777 725 class NoteStartOfMarkHRClosure: public HeapRegionClosure {
ysr@777 726 public:
ysr@777 727 bool doHeapRegion(HeapRegion* r) {
ysr@777 728 if (!r->continuesHumongous()) {
ysr@777 729 r->note_start_of_marking(true);
ysr@777 730 }
ysr@777 731 return false;
ysr@777 732 }
ysr@777 733 };
ysr@777 734
ysr@777 735 void ConcurrentMark::checkpointRootsInitialPre() {
ysr@777 736 G1CollectedHeap* g1h = G1CollectedHeap::heap();
ysr@777 737 G1CollectorPolicy* g1p = g1h->g1_policy();
ysr@777 738
ysr@777 739 _has_aborted = false;
ysr@777 740
ysr@777 741 // Find all the reachable objects...
ysr@777 742 #if PRINT_REACHABLE_AT_INITIAL_MARK
ysr@777 743 guarantee(reachable_file == NULL, "Protocol");
ysr@777 744 char fn_buf[100];
ysr@777 745 sprintf(fn_buf, "/tmp/reachable.txt.%d", os::current_process_id());
ysr@777 746 reachable_file = fopen(fn_buf, "w");
ysr@777 747 // clear the mark bitmap (no grey objects to start with)
ysr@777 748 _nextMarkBitMap->clearAll();
ysr@777 749 PrintReachableClosure prcl(_nextMarkBitMap);
ysr@777 750 g1h->process_strong_roots(
ysr@777 751 false, // fake perm gen collection
ysr@777 752 SharedHeap::SO_AllClasses,
ysr@777 753 &prcl, // Regular roots
ysr@777 754 &prcl // Perm Gen Roots
ysr@777 755 );
ysr@777 756 // The root iteration above "consumed" dirty cards in the perm gen.
ysr@777 757 // Therefore, as a shortcut, we dirty all such cards.
ysr@777 758 g1h->rem_set()->invalidate(g1h->perm_gen()->used_region(), false);
ysr@777 759 fclose(reachable_file);
ysr@777 760 reachable_file = NULL;
ysr@777 761 // clear the mark bitmap again.
ysr@777 762 _nextMarkBitMap->clearAll();
ysr@777 763 COMPILER2_PRESENT(DerivedPointerTable::update_pointers());
ysr@777 764 COMPILER2_PRESENT(DerivedPointerTable::clear());
ysr@777 765 #endif // PRINT_REACHABLE_AT_INITIAL_MARK
ysr@777 766
ysr@777 767 // Initialise marking structures. This has to be done in a STW phase.
ysr@777 768 reset();
ysr@777 769 }
ysr@777 770
ysr@777 771 class CMMarkRootsClosure: public OopsInGenClosure {
ysr@777 772 private:
ysr@777 773 ConcurrentMark* _cm;
ysr@777 774 G1CollectedHeap* _g1h;
ysr@777 775 bool _do_barrier;
ysr@777 776
ysr@777 777 public:
ysr@777 778 CMMarkRootsClosure(ConcurrentMark* cm,
ysr@777 779 G1CollectedHeap* g1h,
ysr@777 780 bool do_barrier) : _cm(cm), _g1h(g1h),
ysr@777 781 _do_barrier(do_barrier) { }
ysr@777 782
ysr@1280 783 virtual void do_oop(narrowOop* p) { do_oop_work(p); }
ysr@1280 784 virtual void do_oop( oop* p) { do_oop_work(p); }
ysr@1280 785
ysr@1280 786 template <class T> void do_oop_work(T* p) {
ysr@1280 787 T heap_oop = oopDesc::load_heap_oop(p);
ysr@1280 788 if (!oopDesc::is_null(heap_oop)) {
ysr@1280 789 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
ysr@1280 790 assert(obj->is_oop() || obj->mark() == NULL,
ysr@777 791 "expected an oop, possibly with mark word displaced");
ysr@1280 792 HeapWord* addr = (HeapWord*)obj;
ysr@777 793 if (_g1h->is_in_g1_reserved(addr)) {
ysr@1280 794 _cm->grayRoot(obj);
ysr@777 795 }
ysr@777 796 }
ysr@777 797 if (_do_barrier) {
ysr@777 798 assert(!_g1h->is_in_g1_reserved(p),
ysr@777 799 "Should be called on external roots");
ysr@777 800 do_barrier(p);
ysr@777 801 }
ysr@777 802 }
ysr@777 803 };
ysr@777 804
ysr@777 805 void ConcurrentMark::checkpointRootsInitialPost() {
ysr@777 806 G1CollectedHeap* g1h = G1CollectedHeap::heap();
ysr@777 807
ysr@777 808 // For each region note start of marking.
ysr@777 809 NoteStartOfMarkHRClosure startcl;
ysr@777 810 g1h->heap_region_iterate(&startcl);
ysr@777 811
ysr@777 812 // Start weak-reference discovery.
ysr@777 813 ReferenceProcessor* rp = g1h->ref_processor();
ysr@777 814 rp->verify_no_references_recorded();
ysr@777 815 rp->enable_discovery(); // enable ("weak") refs discovery
ysr@892 816 rp->setup_policy(false); // snapshot the soft ref policy to be used in this cycle
ysr@777 817
ysr@777 818 SATBMarkQueueSet& satb_mq_set = JavaThread::satb_mark_queue_set();
ysr@777 819 satb_mq_set.set_process_completed_threshold(G1SATBProcessCompletedThreshold);
ysr@777 820 satb_mq_set.set_active_all_threads(true);
ysr@777 821
ysr@777 822 // update_g1_committed() will be called at the end of an evac pause
ysr@777 823 // when marking is on. So, it's also called at the end of the
ysr@777 824 // initial-mark pause to update the heap end, if the heap expands
ysr@777 825 // during it. No need to call it here.
ysr@777 826
ysr@777 827 guarantee( !_cleanup_co_tracker.enabled(), "invariant" );
ysr@777 828
ysr@777 829 size_t max_marking_threads =
ysr@777 830 MAX2((size_t) 1, parallel_marking_threads());
ysr@777 831 for (int i = 0; i < (int)_max_task_num; ++i) {
ysr@777 832 _tasks[i]->enable_co_tracker();
ysr@777 833 if (i < (int) max_marking_threads)
ysr@777 834 _tasks[i]->reset_co_tracker(marking_task_overhead());
ysr@777 835 else
ysr@777 836 _tasks[i]->reset_co_tracker(0.0);
ysr@777 837 }
ysr@777 838 }
ysr@777 839
ysr@777 840 // Checkpoint the roots into this generation from outside
ysr@777 841 // this generation. [Note this initial checkpoint need only
ysr@777 842 // be approximate -- we'll do a catch up phase subsequently.]
ysr@777 843 void ConcurrentMark::checkpointRootsInitial() {
ysr@777 844 assert(SafepointSynchronize::is_at_safepoint(), "world should be stopped");
ysr@777 845 G1CollectedHeap* g1h = G1CollectedHeap::heap();
ysr@777 846
ysr@777 847 double start = os::elapsedTime();
ysr@777 848 GCOverheadReporter::recordSTWStart(start);
ysr@777 849
ysr@777 850 G1CollectorPolicy* g1p = G1CollectedHeap::heap()->g1_policy();
ysr@777 851 g1p->record_concurrent_mark_init_start();
ysr@777 852 checkpointRootsInitialPre();
ysr@777 853
ysr@777 854 // YSR: when concurrent precleaning is in place, we'll
ysr@777 855 // need to clear the cached card table here
ysr@777 856
ysr@777 857 ResourceMark rm;
ysr@777 858 HandleMark hm;
ysr@777 859
ysr@777 860 g1h->ensure_parsability(false);
ysr@777 861 g1h->perm_gen()->save_marks();
ysr@777 862
ysr@777 863 CMMarkRootsClosure notOlder(this, g1h, false);
ysr@777 864 CMMarkRootsClosure older(this, g1h, true);
ysr@777 865
ysr@777 866 g1h->set_marking_started();
ysr@777 867 g1h->rem_set()->prepare_for_younger_refs_iterate(false);
ysr@777 868
ysr@777 869 g1h->process_strong_roots(false, // fake perm gen collection
ysr@777 870 SharedHeap::SO_AllClasses,
ysr@777 871 &notOlder, // Regular roots
ysr@777 872 &older // Perm Gen Roots
ysr@777 873 );
ysr@777 874 checkpointRootsInitialPost();
ysr@777 875
ysr@777 876 // Statistics.
ysr@777 877 double end = os::elapsedTime();
ysr@777 878 _init_times.add((end - start) * 1000.0);
ysr@777 879 GCOverheadReporter::recordSTWEnd(end);
ysr@777 880
ysr@777 881 g1p->record_concurrent_mark_init_end();
ysr@777 882 }
ysr@777 883
ysr@777 884 /*
ysr@777 885 Notice that in the next two methods, we actually leave the STS
ysr@777 886 during the barrier sync and join it immediately afterwards. If we
ysr@777 887 do not do this, this then the following deadlock can occur: one
ysr@777 888 thread could be in the barrier sync code, waiting for the other
ysr@777 889 thread to also sync up, whereas another one could be trying to
ysr@777 890 yield, while also waiting for the other threads to sync up too.
ysr@777 891
ysr@777 892 Because the thread that does the sync barrier has left the STS, it
ysr@777 893 is possible to be suspended for a Full GC or an evacuation pause
ysr@777 894 could occur. This is actually safe, since the entering the sync
ysr@777 895 barrier is one of the last things do_marking_step() does, and it
ysr@777 896 doesn't manipulate any data structures afterwards.
ysr@777 897 */
ysr@777 898
ysr@777 899 void ConcurrentMark::enter_first_sync_barrier(int task_num) {
ysr@777 900 if (verbose_low())
ysr@777 901 gclog_or_tty->print_cr("[%d] entering first barrier", task_num);
ysr@777 902
ysr@777 903 ConcurrentGCThread::stsLeave();
ysr@777 904 _first_overflow_barrier_sync.enter();
ysr@777 905 ConcurrentGCThread::stsJoin();
ysr@777 906 // at this point everyone should have synced up and not be doing any
ysr@777 907 // more work
ysr@777 908
ysr@777 909 if (verbose_low())
ysr@777 910 gclog_or_tty->print_cr("[%d] leaving first barrier", task_num);
ysr@777 911
ysr@777 912 // let task 0 do this
ysr@777 913 if (task_num == 0) {
ysr@777 914 // task 0 is responsible for clearing the global data structures
ysr@777 915 clear_marking_state();
ysr@777 916
ysr@777 917 if (PrintGC) {
ysr@777 918 gclog_or_tty->date_stamp(PrintGCDateStamps);
ysr@777 919 gclog_or_tty->stamp(PrintGCTimeStamps);
ysr@777 920 gclog_or_tty->print_cr("[GC concurrent-mark-reset-for-overflow]");
ysr@777 921 }
ysr@777 922 }
ysr@777 923
ysr@777 924 // after this, each task should reset its own data structures then
ysr@777 925 // then go into the second barrier
ysr@777 926 }
ysr@777 927
ysr@777 928 void ConcurrentMark::enter_second_sync_barrier(int task_num) {
ysr@777 929 if (verbose_low())
ysr@777 930 gclog_or_tty->print_cr("[%d] entering second barrier", task_num);
ysr@777 931
ysr@777 932 ConcurrentGCThread::stsLeave();
ysr@777 933 _second_overflow_barrier_sync.enter();
ysr@777 934 ConcurrentGCThread::stsJoin();
ysr@777 935 // at this point everything should be re-initialised and ready to go
ysr@777 936
ysr@777 937 if (verbose_low())
ysr@777 938 gclog_or_tty->print_cr("[%d] leaving second barrier", task_num);
ysr@777 939 }
ysr@777 940
ysr@777 941 void ConcurrentMark::grayRoot(oop p) {
ysr@777 942 HeapWord* addr = (HeapWord*) p;
ysr@777 943 // We can't really check against _heap_start and _heap_end, since it
ysr@777 944 // is possible during an evacuation pause with piggy-backed
ysr@777 945 // initial-mark that the committed space is expanded during the
ysr@777 946 // pause without CM observing this change. So the assertions below
ysr@777 947 // is a bit conservative; but better than nothing.
ysr@777 948 tmp_guarantee_CM( _g1h->g1_committed().contains(addr),
ysr@777 949 "address should be within the heap bounds" );
ysr@777 950
ysr@777 951 if (!_nextMarkBitMap->isMarked(addr))
ysr@777 952 _nextMarkBitMap->parMark(addr);
ysr@777 953 }
ysr@777 954
ysr@777 955 void ConcurrentMark::grayRegionIfNecessary(MemRegion mr) {
ysr@777 956 // The objects on the region have already been marked "in bulk" by
ysr@777 957 // the caller. We only need to decide whether to push the region on
ysr@777 958 // the region stack or not.
ysr@777 959
ysr@777 960 if (!concurrent_marking_in_progress() || !_should_gray_objects)
ysr@777 961 // We're done with marking and waiting for remark. We do not need to
ysr@777 962 // push anything else on the region stack.
ysr@777 963 return;
ysr@777 964
ysr@777 965 HeapWord* finger = _finger;
ysr@777 966
ysr@777 967 if (verbose_low())
ysr@777 968 gclog_or_tty->print_cr("[global] attempting to push "
ysr@777 969 "region ["PTR_FORMAT", "PTR_FORMAT"), finger is at "
ysr@777 970 PTR_FORMAT, mr.start(), mr.end(), finger);
ysr@777 971
ysr@777 972 if (mr.start() < finger) {
ysr@777 973 // The finger is always heap region aligned and it is not possible
ysr@777 974 // for mr to span heap regions.
ysr@777 975 tmp_guarantee_CM( mr.end() <= finger, "invariant" );
ysr@777 976
ysr@777 977 tmp_guarantee_CM( mr.start() <= mr.end() &&
ysr@777 978 _heap_start <= mr.start() &&
ysr@777 979 mr.end() <= _heap_end,
ysr@777 980 "region boundaries should fall within the committed space" );
ysr@777 981 if (verbose_low())
ysr@777 982 gclog_or_tty->print_cr("[global] region ["PTR_FORMAT", "PTR_FORMAT") "
ysr@777 983 "below the finger, pushing it",
ysr@777 984 mr.start(), mr.end());
ysr@777 985
ysr@777 986 if (!region_stack_push(mr)) {
ysr@777 987 if (verbose_low())
ysr@777 988 gclog_or_tty->print_cr("[global] region stack has overflown.");
ysr@777 989 }
ysr@777 990 }
ysr@777 991 }
ysr@777 992
ysr@777 993 void ConcurrentMark::markAndGrayObjectIfNecessary(oop p) {
ysr@777 994 // The object is not marked by the caller. We need to at least mark
ysr@777 995 // it and maybe push in on the stack.
ysr@777 996
ysr@777 997 HeapWord* addr = (HeapWord*)p;
ysr@777 998 if (!_nextMarkBitMap->isMarked(addr)) {
ysr@777 999 // We definitely need to mark it, irrespective whether we bail out
ysr@777 1000 // because we're done with marking.
ysr@777 1001 if (_nextMarkBitMap->parMark(addr)) {
ysr@777 1002 if (!concurrent_marking_in_progress() || !_should_gray_objects)
ysr@777 1003 // If we're done with concurrent marking and we're waiting for
ysr@777 1004 // remark, then we're not pushing anything on the stack.
ysr@777 1005 return;
ysr@777 1006
ysr@777 1007 // No OrderAccess:store_load() is needed. It is implicit in the
ysr@777 1008 // CAS done in parMark(addr) above
ysr@777 1009 HeapWord* finger = _finger;
ysr@777 1010
ysr@777 1011 if (addr < finger) {
ysr@777 1012 if (!mark_stack_push(oop(addr))) {
ysr@777 1013 if (verbose_low())
ysr@777 1014 gclog_or_tty->print_cr("[global] global stack overflow "
ysr@777 1015 "during parMark");
ysr@777 1016 }
ysr@777 1017 }
ysr@777 1018 }
ysr@777 1019 }
ysr@777 1020 }
ysr@777 1021
ysr@777 1022 class CMConcurrentMarkingTask: public AbstractGangTask {
ysr@777 1023 private:
ysr@777 1024 ConcurrentMark* _cm;
ysr@777 1025 ConcurrentMarkThread* _cmt;
ysr@777 1026
ysr@777 1027 public:
ysr@777 1028 void work(int worker_i) {
ysr@777 1029 guarantee( Thread::current()->is_ConcurrentGC_thread(),
ysr@777 1030 "this should only be done by a conc GC thread" );
ysr@777 1031
ysr@777 1032 double start_vtime = os::elapsedVTime();
ysr@777 1033
ysr@777 1034 ConcurrentGCThread::stsJoin();
ysr@777 1035
ysr@777 1036 guarantee( (size_t)worker_i < _cm->active_tasks(), "invariant" );
ysr@777 1037 CMTask* the_task = _cm->task(worker_i);
ysr@777 1038 the_task->start_co_tracker();
ysr@777 1039 the_task->record_start_time();
ysr@777 1040 if (!_cm->has_aborted()) {
ysr@777 1041 do {
ysr@777 1042 double start_vtime_sec = os::elapsedVTime();
ysr@777 1043 double start_time_sec = os::elapsedTime();
ysr@777 1044 the_task->do_marking_step(10.0);
ysr@777 1045 double end_time_sec = os::elapsedTime();
ysr@777 1046 double end_vtime_sec = os::elapsedVTime();
ysr@777 1047 double elapsed_vtime_sec = end_vtime_sec - start_vtime_sec;
ysr@777 1048 double elapsed_time_sec = end_time_sec - start_time_sec;
ysr@777 1049 _cm->clear_has_overflown();
ysr@777 1050
ysr@777 1051 bool ret = _cm->do_yield_check(worker_i);
ysr@777 1052
ysr@777 1053 jlong sleep_time_ms;
ysr@777 1054 if (!_cm->has_aborted() && the_task->has_aborted()) {
ysr@777 1055 sleep_time_ms =
ysr@777 1056 (jlong) (elapsed_vtime_sec * _cm->sleep_factor() * 1000.0);
ysr@777 1057 ConcurrentGCThread::stsLeave();
ysr@777 1058 os::sleep(Thread::current(), sleep_time_ms, false);
ysr@777 1059 ConcurrentGCThread::stsJoin();
ysr@777 1060 }
ysr@777 1061 double end_time2_sec = os::elapsedTime();
ysr@777 1062 double elapsed_time2_sec = end_time2_sec - start_time_sec;
ysr@777 1063
ysr@777 1064 the_task->update_co_tracker();
ysr@777 1065
ysr@777 1066 #if 0
ysr@777 1067 gclog_or_tty->print_cr("CM: elapsed %1.4lf ms, sleep %1.4lf ms, "
ysr@777 1068 "overhead %1.4lf",
ysr@777 1069 elapsed_vtime_sec * 1000.0, (double) sleep_time_ms,
ysr@777 1070 the_task->conc_overhead(os::elapsedTime()) * 8.0);
ysr@777 1071 gclog_or_tty->print_cr("elapsed time %1.4lf ms, time 2: %1.4lf ms",
ysr@777 1072 elapsed_time_sec * 1000.0, elapsed_time2_sec * 1000.0);
ysr@777 1073 #endif
ysr@777 1074 } while (!_cm->has_aborted() && the_task->has_aborted());
ysr@777 1075 }
ysr@777 1076 the_task->record_end_time();
ysr@777 1077 guarantee( !the_task->has_aborted() || _cm->has_aborted(), "invariant" );
ysr@777 1078
ysr@777 1079 ConcurrentGCThread::stsLeave();
ysr@777 1080
ysr@777 1081 double end_vtime = os::elapsedVTime();
ysr@777 1082 the_task->update_co_tracker(true);
ysr@777 1083 _cm->update_accum_task_vtime(worker_i, end_vtime - start_vtime);
ysr@777 1084 }
ysr@777 1085
ysr@777 1086 CMConcurrentMarkingTask(ConcurrentMark* cm,
ysr@777 1087 ConcurrentMarkThread* cmt) :
ysr@777 1088 AbstractGangTask("Concurrent Mark"), _cm(cm), _cmt(cmt) { }
ysr@777 1089
ysr@777 1090 ~CMConcurrentMarkingTask() { }
ysr@777 1091 };
ysr@777 1092
ysr@777 1093 void ConcurrentMark::markFromRoots() {
ysr@777 1094 // we might be tempted to assert that:
ysr@777 1095 // assert(asynch == !SafepointSynchronize::is_at_safepoint(),
ysr@777 1096 // "inconsistent argument?");
ysr@777 1097 // However that wouldn't be right, because it's possible that
ysr@777 1098 // a safepoint is indeed in progress as a younger generation
ysr@777 1099 // stop-the-world GC happens even as we mark in this generation.
ysr@777 1100
ysr@777 1101 _restart_for_overflow = false;
ysr@777 1102
ysr@777 1103 set_phase(MAX2((size_t) 1, parallel_marking_threads()), true);
ysr@777 1104
ysr@777 1105 CMConcurrentMarkingTask markingTask(this, cmThread());
ysr@777 1106 if (parallel_marking_threads() > 0)
ysr@777 1107 _parallel_workers->run_task(&markingTask);
ysr@777 1108 else
ysr@777 1109 markingTask.work(0);
ysr@777 1110 print_stats();
ysr@777 1111 }
ysr@777 1112
ysr@777 1113 void ConcurrentMark::checkpointRootsFinal(bool clear_all_soft_refs) {
ysr@777 1114 // world is stopped at this checkpoint
ysr@777 1115 assert(SafepointSynchronize::is_at_safepoint(),
ysr@777 1116 "world should be stopped");
ysr@777 1117 G1CollectedHeap* g1h = G1CollectedHeap::heap();
ysr@777 1118
ysr@777 1119 // If a full collection has happened, we shouldn't do this.
ysr@777 1120 if (has_aborted()) {
ysr@777 1121 g1h->set_marking_complete(); // So bitmap clearing isn't confused
ysr@777 1122 return;
ysr@777 1123 }
ysr@777 1124
ysr@1280 1125 if (VerifyDuringGC) {
ysr@1280 1126 HandleMark hm; // handle scope
ysr@1280 1127 gclog_or_tty->print(" VerifyDuringGC:(before)");
ysr@1280 1128 Universe::heap()->prepare_for_verify();
ysr@1280 1129 Universe::verify(true, false, true);
ysr@1280 1130 }
ysr@1280 1131
ysr@777 1132 G1CollectorPolicy* g1p = g1h->g1_policy();
ysr@777 1133 g1p->record_concurrent_mark_remark_start();
ysr@777 1134
ysr@777 1135 double start = os::elapsedTime();
ysr@777 1136 GCOverheadReporter::recordSTWStart(start);
ysr@777 1137
ysr@777 1138 checkpointRootsFinalWork();
ysr@777 1139
ysr@777 1140 double mark_work_end = os::elapsedTime();
ysr@777 1141
ysr@777 1142 weakRefsWork(clear_all_soft_refs);
ysr@777 1143
ysr@777 1144 if (has_overflown()) {
ysr@777 1145 // Oops. We overflowed. Restart concurrent marking.
ysr@777 1146 _restart_for_overflow = true;
ysr@777 1147 // Clear the flag. We do not need it any more.
ysr@777 1148 clear_has_overflown();
ysr@777 1149 if (G1TraceMarkStackOverflow)
ysr@777 1150 gclog_or_tty->print_cr("\nRemark led to restart for overflow.");
ysr@777 1151 } else {
ysr@777 1152 // We're done with marking.
ysr@777 1153 JavaThread::satb_mark_queue_set().set_active_all_threads(false);
tonyp@1246 1154
tonyp@1246 1155 if (VerifyDuringGC) {
ysr@1280 1156 HandleMark hm; // handle scope
ysr@1280 1157 gclog_or_tty->print(" VerifyDuringGC:(after)");
ysr@1280 1158 Universe::heap()->prepare_for_verify();
ysr@1280 1159 Universe::heap()->verify(/* allow_dirty */ true,
ysr@1280 1160 /* silent */ false,
ysr@1280 1161 /* use_prev_marking */ false);
tonyp@1246 1162 }
ysr@777 1163 }
ysr@777 1164
ysr@777 1165 #if VERIFY_OBJS_PROCESSED
ysr@777 1166 _scan_obj_cl.objs_processed = 0;
ysr@777 1167 ThreadLocalObjQueue::objs_enqueued = 0;
ysr@777 1168 #endif
ysr@777 1169
ysr@777 1170 // Statistics
ysr@777 1171 double now = os::elapsedTime();
ysr@777 1172 _remark_mark_times.add((mark_work_end - start) * 1000.0);
ysr@777 1173 _remark_weak_ref_times.add((now - mark_work_end) * 1000.0);
ysr@777 1174 _remark_times.add((now - start) * 1000.0);
ysr@777 1175
ysr@777 1176 GCOverheadReporter::recordSTWEnd(now);
ysr@777 1177 for (int i = 0; i < (int)_max_task_num; ++i)
ysr@777 1178 _tasks[i]->disable_co_tracker();
ysr@777 1179 _cleanup_co_tracker.enable();
ysr@777 1180 _cleanup_co_tracker.reset(cleanup_task_overhead());
ysr@777 1181 g1p->record_concurrent_mark_remark_end();
ysr@777 1182 }
ysr@777 1183
ysr@777 1184
ysr@777 1185 #define CARD_BM_TEST_MODE 0
ysr@777 1186
ysr@777 1187 class CalcLiveObjectsClosure: public HeapRegionClosure {
ysr@777 1188
ysr@777 1189 CMBitMapRO* _bm;
ysr@777 1190 ConcurrentMark* _cm;
ysr@777 1191 COTracker* _co_tracker;
ysr@777 1192 bool _changed;
ysr@777 1193 bool _yield;
ysr@777 1194 size_t _words_done;
ysr@777 1195 size_t _tot_live;
ysr@777 1196 size_t _tot_used;
ysr@777 1197 size_t _regions_done;
ysr@777 1198 double _start_vtime_sec;
ysr@777 1199
ysr@777 1200 BitMap* _region_bm;
ysr@777 1201 BitMap* _card_bm;
ysr@777 1202 intptr_t _bottom_card_num;
ysr@777 1203 bool _final;
ysr@777 1204
ysr@777 1205 void mark_card_num_range(intptr_t start_card_num, intptr_t last_card_num) {
ysr@777 1206 for (intptr_t i = start_card_num; i <= last_card_num; i++) {
ysr@777 1207 #if CARD_BM_TEST_MODE
ysr@777 1208 guarantee(_card_bm->at(i - _bottom_card_num),
ysr@777 1209 "Should already be set.");
ysr@777 1210 #else
ysr@777 1211 _card_bm->par_at_put(i - _bottom_card_num, 1);
ysr@777 1212 #endif
ysr@777 1213 }
ysr@777 1214 }
ysr@777 1215
ysr@777 1216 public:
ysr@777 1217 CalcLiveObjectsClosure(bool final,
ysr@777 1218 CMBitMapRO *bm, ConcurrentMark *cm,
ysr@777 1219 BitMap* region_bm, BitMap* card_bm,
ysr@777 1220 COTracker* co_tracker) :
ysr@777 1221 _bm(bm), _cm(cm), _changed(false), _yield(true),
ysr@777 1222 _words_done(0), _tot_live(0), _tot_used(0),
ysr@777 1223 _region_bm(region_bm), _card_bm(card_bm),
ysr@777 1224 _final(final), _co_tracker(co_tracker),
ysr@777 1225 _regions_done(0), _start_vtime_sec(0.0)
ysr@777 1226 {
ysr@777 1227 _bottom_card_num =
ysr@777 1228 intptr_t(uintptr_t(G1CollectedHeap::heap()->reserved_region().start()) >>
ysr@777 1229 CardTableModRefBS::card_shift);
ysr@777 1230 }
ysr@777 1231
tonyp@1264 1232 // It takes a region that's not empty (i.e., it has at least one
tonyp@1264 1233 // live object in it and sets its corresponding bit on the region
tonyp@1264 1234 // bitmap to 1. If the region is "starts humongous" it will also set
tonyp@1264 1235 // to 1 the bits on the region bitmap that correspond to its
tonyp@1264 1236 // associated "continues humongous" regions.
tonyp@1264 1237 void set_bit_for_region(HeapRegion* hr) {
tonyp@1264 1238 assert(!hr->continuesHumongous(), "should have filtered those out");
tonyp@1264 1239
tonyp@1264 1240 size_t index = hr->hrs_index();
tonyp@1264 1241 if (!hr->startsHumongous()) {
tonyp@1264 1242 // Normal (non-humongous) case: just set the bit.
tonyp@1264 1243 _region_bm->par_at_put((BitMap::idx_t) index, true);
tonyp@1264 1244 } else {
tonyp@1264 1245 // Starts humongous case: calculate how many regions are part of
tonyp@1264 1246 // this humongous region and then set the bit range. It might
tonyp@1264 1247 // have been a bit more efficient to look at the object that
tonyp@1264 1248 // spans these humongous regions to calculate their number from
tonyp@1264 1249 // the object's size. However, it's a good idea to calculate
tonyp@1264 1250 // this based on the metadata itself, and not the region
tonyp@1264 1251 // contents, so that this code is not aware of what goes into
tonyp@1264 1252 // the humongous regions (in case this changes in the future).
tonyp@1264 1253 G1CollectedHeap* g1h = G1CollectedHeap::heap();
tonyp@1264 1254 size_t end_index = index + 1;
tonyp@1266 1255 while (end_index < g1h->n_regions()) {
tonyp@1266 1256 HeapRegion* chr = g1h->region_at(end_index);
tonyp@1264 1257 if (!chr->continuesHumongous()) {
tonyp@1264 1258 break;
tonyp@1264 1259 }
tonyp@1264 1260 end_index += 1;
tonyp@1264 1261 }
tonyp@1264 1262 _region_bm->par_at_put_range((BitMap::idx_t) index,
tonyp@1264 1263 (BitMap::idx_t) end_index, true);
tonyp@1264 1264 }
tonyp@1264 1265 }
tonyp@1264 1266
ysr@777 1267 bool doHeapRegion(HeapRegion* hr) {
ysr@777 1268 if (_co_tracker != NULL)
ysr@777 1269 _co_tracker->update();
ysr@777 1270
ysr@777 1271 if (!_final && _regions_done == 0)
ysr@777 1272 _start_vtime_sec = os::elapsedVTime();
ysr@777 1273
iveresov@1074 1274 if (hr->continuesHumongous()) {
tonyp@1264 1275 // We will ignore these here and process them when their
tonyp@1264 1276 // associated "starts humongous" region is processed (see
tonyp@1264 1277 // set_bit_for_heap_region()). Note that we cannot rely on their
tonyp@1264 1278 // associated "starts humongous" region to have their bit set to
tonyp@1264 1279 // 1 since, due to the region chunking in the parallel region
tonyp@1264 1280 // iteration, a "continues humongous" region might be visited
tonyp@1264 1281 // before its associated "starts humongous".
iveresov@1074 1282 return false;
iveresov@1074 1283 }
ysr@777 1284
ysr@777 1285 HeapWord* nextTop = hr->next_top_at_mark_start();
ysr@777 1286 HeapWord* start = hr->top_at_conc_mark_count();
ysr@777 1287 assert(hr->bottom() <= start && start <= hr->end() &&
ysr@777 1288 hr->bottom() <= nextTop && nextTop <= hr->end() &&
ysr@777 1289 start <= nextTop,
ysr@777 1290 "Preconditions.");
ysr@777 1291 // Otherwise, record the number of word's we'll examine.
ysr@777 1292 size_t words_done = (nextTop - start);
ysr@777 1293 // Find the first marked object at or after "start".
ysr@777 1294 start = _bm->getNextMarkedWordAddress(start, nextTop);
ysr@777 1295 size_t marked_bytes = 0;
ysr@777 1296
ysr@777 1297 // Below, the term "card num" means the result of shifting an address
ysr@777 1298 // by the card shift -- address 0 corresponds to card number 0. One
ysr@777 1299 // must subtract the card num of the bottom of the heap to obtain a
ysr@777 1300 // card table index.
ysr@777 1301 // The first card num of the sequence of live cards currently being
ysr@777 1302 // constructed. -1 ==> no sequence.
ysr@777 1303 intptr_t start_card_num = -1;
ysr@777 1304 // The last card num of the sequence of live cards currently being
ysr@777 1305 // constructed. -1 ==> no sequence.
ysr@777 1306 intptr_t last_card_num = -1;
ysr@777 1307
ysr@777 1308 while (start < nextTop) {
ysr@777 1309 if (_yield && _cm->do_yield_check()) {
ysr@777 1310 // We yielded. It might be for a full collection, in which case
ysr@777 1311 // all bets are off; terminate the traversal.
ysr@777 1312 if (_cm->has_aborted()) {
ysr@777 1313 _changed = false;
ysr@777 1314 return true;
ysr@777 1315 } else {
ysr@777 1316 // Otherwise, it might be a collection pause, and the region
ysr@777 1317 // we're looking at might be in the collection set. We'll
ysr@777 1318 // abandon this region.
ysr@777 1319 return false;
ysr@777 1320 }
ysr@777 1321 }
ysr@777 1322 oop obj = oop(start);
ysr@777 1323 int obj_sz = obj->size();
ysr@777 1324 // The card num of the start of the current object.
ysr@777 1325 intptr_t obj_card_num =
ysr@777 1326 intptr_t(uintptr_t(start) >> CardTableModRefBS::card_shift);
ysr@777 1327
ysr@777 1328 HeapWord* obj_last = start + obj_sz - 1;
ysr@777 1329 intptr_t obj_last_card_num =
ysr@777 1330 intptr_t(uintptr_t(obj_last) >> CardTableModRefBS::card_shift);
ysr@777 1331
ysr@777 1332 if (obj_card_num != last_card_num) {
ysr@777 1333 if (start_card_num == -1) {
ysr@777 1334 assert(last_card_num == -1, "Both or neither.");
ysr@777 1335 start_card_num = obj_card_num;
ysr@777 1336 } else {
ysr@777 1337 assert(last_card_num != -1, "Both or neither.");
ysr@777 1338 assert(obj_card_num >= last_card_num, "Inv");
ysr@777 1339 if ((obj_card_num - last_card_num) > 1) {
ysr@777 1340 // Mark the last run, and start a new one.
ysr@777 1341 mark_card_num_range(start_card_num, last_card_num);
ysr@777 1342 start_card_num = obj_card_num;
ysr@777 1343 }
ysr@777 1344 }
ysr@777 1345 #if CARD_BM_TEST_MODE
ysr@777 1346 /*
ysr@777 1347 gclog_or_tty->print_cr("Setting bits from %d/%d.",
ysr@777 1348 obj_card_num - _bottom_card_num,
ysr@777 1349 obj_last_card_num - _bottom_card_num);
ysr@777 1350 */
ysr@777 1351 for (intptr_t j = obj_card_num; j <= obj_last_card_num; j++) {
ysr@777 1352 _card_bm->par_at_put(j - _bottom_card_num, 1);
ysr@777 1353 }
ysr@777 1354 #endif
ysr@777 1355 }
ysr@777 1356 // In any case, we set the last card num.
ysr@777 1357 last_card_num = obj_last_card_num;
ysr@777 1358
ysr@777 1359 marked_bytes += obj_sz * HeapWordSize;
ysr@777 1360 // Find the next marked object after this one.
ysr@777 1361 start = _bm->getNextMarkedWordAddress(start + 1, nextTop);
ysr@777 1362 _changed = true;
ysr@777 1363 }
ysr@777 1364 // Handle the last range, if any.
ysr@777 1365 if (start_card_num != -1)
ysr@777 1366 mark_card_num_range(start_card_num, last_card_num);
ysr@777 1367 if (_final) {
ysr@777 1368 // Mark the allocated-since-marking portion...
ysr@777 1369 HeapWord* tp = hr->top();
ysr@777 1370 if (nextTop < tp) {
ysr@777 1371 start_card_num =
ysr@777 1372 intptr_t(uintptr_t(nextTop) >> CardTableModRefBS::card_shift);
ysr@777 1373 last_card_num =
ysr@777 1374 intptr_t(uintptr_t(tp) >> CardTableModRefBS::card_shift);
ysr@777 1375 mark_card_num_range(start_card_num, last_card_num);
ysr@777 1376 // This definitely means the region has live objects.
tonyp@1264 1377 set_bit_for_region(hr);
ysr@777 1378 }
ysr@777 1379 }
ysr@777 1380
ysr@777 1381 hr->add_to_marked_bytes(marked_bytes);
ysr@777 1382 // Update the live region bitmap.
ysr@777 1383 if (marked_bytes > 0) {
tonyp@1264 1384 set_bit_for_region(hr);
ysr@777 1385 }
ysr@777 1386 hr->set_top_at_conc_mark_count(nextTop);
ysr@777 1387 _tot_live += hr->next_live_bytes();
ysr@777 1388 _tot_used += hr->used();
ysr@777 1389 _words_done = words_done;
ysr@777 1390
ysr@777 1391 if (!_final) {
ysr@777 1392 ++_regions_done;
ysr@777 1393 if (_regions_done % 10 == 0) {
ysr@777 1394 double end_vtime_sec = os::elapsedVTime();
ysr@777 1395 double elapsed_vtime_sec = end_vtime_sec - _start_vtime_sec;
ysr@777 1396 if (elapsed_vtime_sec > (10.0 / 1000.0)) {
ysr@777 1397 jlong sleep_time_ms =
ysr@777 1398 (jlong) (elapsed_vtime_sec * _cm->cleanup_sleep_factor() * 1000.0);
ysr@777 1399 #if 0
ysr@777 1400 gclog_or_tty->print_cr("CL: elapsed %1.4lf ms, sleep %1.4lf ms, "
ysr@777 1401 "overhead %1.4lf",
ysr@777 1402 elapsed_vtime_sec * 1000.0, (double) sleep_time_ms,
ysr@777 1403 _co_tracker->concOverhead(os::elapsedTime()));
ysr@777 1404 #endif
ysr@777 1405 os::sleep(Thread::current(), sleep_time_ms, false);
ysr@777 1406 _start_vtime_sec = end_vtime_sec;
ysr@777 1407 }
ysr@777 1408 }
ysr@777 1409 }
ysr@777 1410
ysr@777 1411 return false;
ysr@777 1412 }
ysr@777 1413
ysr@777 1414 bool changed() { return _changed; }
ysr@777 1415 void reset() { _changed = false; _words_done = 0; }
ysr@777 1416 void no_yield() { _yield = false; }
ysr@777 1417 size_t words_done() { return _words_done; }
ysr@777 1418 size_t tot_live() { return _tot_live; }
ysr@777 1419 size_t tot_used() { return _tot_used; }
ysr@777 1420 };
ysr@777 1421
ysr@777 1422
ysr@777 1423 void ConcurrentMark::calcDesiredRegions() {
ysr@777 1424 guarantee( _cleanup_co_tracker.enabled(), "invariant" );
ysr@777 1425 _cleanup_co_tracker.start();
ysr@777 1426
ysr@777 1427 _region_bm.clear();
ysr@777 1428 _card_bm.clear();
ysr@777 1429 CalcLiveObjectsClosure calccl(false /*final*/,
ysr@777 1430 nextMarkBitMap(), this,
ysr@777 1431 &_region_bm, &_card_bm,
ysr@777 1432 &_cleanup_co_tracker);
ysr@777 1433 G1CollectedHeap *g1h = G1CollectedHeap::heap();
ysr@777 1434 g1h->heap_region_iterate(&calccl);
ysr@777 1435
ysr@777 1436 do {
ysr@777 1437 calccl.reset();
ysr@777 1438 g1h->heap_region_iterate(&calccl);
ysr@777 1439 } while (calccl.changed());
ysr@777 1440
ysr@777 1441 _cleanup_co_tracker.update(true);
ysr@777 1442 }
ysr@777 1443
ysr@777 1444 class G1ParFinalCountTask: public AbstractGangTask {
ysr@777 1445 protected:
ysr@777 1446 G1CollectedHeap* _g1h;
ysr@777 1447 CMBitMap* _bm;
ysr@777 1448 size_t _n_workers;
ysr@777 1449 size_t *_live_bytes;
ysr@777 1450 size_t *_used_bytes;
ysr@777 1451 BitMap* _region_bm;
ysr@777 1452 BitMap* _card_bm;
ysr@777 1453 public:
ysr@777 1454 G1ParFinalCountTask(G1CollectedHeap* g1h, CMBitMap* bm,
ysr@777 1455 BitMap* region_bm, BitMap* card_bm) :
ysr@777 1456 AbstractGangTask("G1 final counting"), _g1h(g1h),
ysr@777 1457 _bm(bm), _region_bm(region_bm), _card_bm(card_bm)
ysr@777 1458 {
ysr@777 1459 if (ParallelGCThreads > 0)
ysr@777 1460 _n_workers = _g1h->workers()->total_workers();
ysr@777 1461 else
ysr@777 1462 _n_workers = 1;
ysr@777 1463 _live_bytes = NEW_C_HEAP_ARRAY(size_t, _n_workers);
ysr@777 1464 _used_bytes = NEW_C_HEAP_ARRAY(size_t, _n_workers);
ysr@777 1465 }
ysr@777 1466
ysr@777 1467 ~G1ParFinalCountTask() {
ysr@777 1468 FREE_C_HEAP_ARRAY(size_t, _live_bytes);
ysr@777 1469 FREE_C_HEAP_ARRAY(size_t, _used_bytes);
ysr@777 1470 }
ysr@777 1471
ysr@777 1472 void work(int i) {
ysr@777 1473 CalcLiveObjectsClosure calccl(true /*final*/,
ysr@777 1474 _bm, _g1h->concurrent_mark(),
ysr@777 1475 _region_bm, _card_bm,
ysr@777 1476 NULL /* CO tracker */);
ysr@777 1477 calccl.no_yield();
ysr@777 1478 if (ParallelGCThreads > 0) {
tonyp@790 1479 _g1h->heap_region_par_iterate_chunked(&calccl, i,
tonyp@790 1480 HeapRegion::FinalCountClaimValue);
ysr@777 1481 } else {
ysr@777 1482 _g1h->heap_region_iterate(&calccl);
ysr@777 1483 }
ysr@777 1484 assert(calccl.complete(), "Shouldn't have yielded!");
ysr@777 1485
ysr@777 1486 guarantee( (size_t)i < _n_workers, "invariant" );
ysr@777 1487 _live_bytes[i] = calccl.tot_live();
ysr@777 1488 _used_bytes[i] = calccl.tot_used();
ysr@777 1489 }
ysr@777 1490 size_t live_bytes() {
ysr@777 1491 size_t live_bytes = 0;
ysr@777 1492 for (size_t i = 0; i < _n_workers; ++i)
ysr@777 1493 live_bytes += _live_bytes[i];
ysr@777 1494 return live_bytes;
ysr@777 1495 }
ysr@777 1496 size_t used_bytes() {
ysr@777 1497 size_t used_bytes = 0;
ysr@777 1498 for (size_t i = 0; i < _n_workers; ++i)
ysr@777 1499 used_bytes += _used_bytes[i];
ysr@777 1500 return used_bytes;
ysr@777 1501 }
ysr@777 1502 };
ysr@777 1503
ysr@777 1504 class G1ParNoteEndTask;
ysr@777 1505
ysr@777 1506 class G1NoteEndOfConcMarkClosure : public HeapRegionClosure {
ysr@777 1507 G1CollectedHeap* _g1;
ysr@777 1508 int _worker_num;
ysr@777 1509 size_t _max_live_bytes;
ysr@777 1510 size_t _regions_claimed;
ysr@777 1511 size_t _freed_bytes;
ysr@777 1512 size_t _cleared_h_regions;
ysr@777 1513 size_t _freed_regions;
ysr@777 1514 UncleanRegionList* _unclean_region_list;
ysr@777 1515 double _claimed_region_time;
ysr@777 1516 double _max_region_time;
ysr@777 1517
ysr@777 1518 public:
ysr@777 1519 G1NoteEndOfConcMarkClosure(G1CollectedHeap* g1,
ysr@777 1520 UncleanRegionList* list,
ysr@777 1521 int worker_num);
ysr@777 1522 size_t freed_bytes() { return _freed_bytes; }
ysr@777 1523 size_t cleared_h_regions() { return _cleared_h_regions; }
ysr@777 1524 size_t freed_regions() { return _freed_regions; }
ysr@777 1525 UncleanRegionList* unclean_region_list() {
ysr@777 1526 return _unclean_region_list;
ysr@777 1527 }
ysr@777 1528
ysr@777 1529 bool doHeapRegion(HeapRegion *r);
ysr@777 1530
ysr@777 1531 size_t max_live_bytes() { return _max_live_bytes; }
ysr@777 1532 size_t regions_claimed() { return _regions_claimed; }
ysr@777 1533 double claimed_region_time_sec() { return _claimed_region_time; }
ysr@777 1534 double max_region_time_sec() { return _max_region_time; }
ysr@777 1535 };
ysr@777 1536
ysr@777 1537 class G1ParNoteEndTask: public AbstractGangTask {
ysr@777 1538 friend class G1NoteEndOfConcMarkClosure;
ysr@777 1539 protected:
ysr@777 1540 G1CollectedHeap* _g1h;
ysr@777 1541 size_t _max_live_bytes;
ysr@777 1542 size_t _freed_bytes;
ysr@777 1543 ConcurrentMark::ParCleanupThreadState** _par_cleanup_thread_state;
ysr@777 1544 public:
ysr@777 1545 G1ParNoteEndTask(G1CollectedHeap* g1h,
ysr@777 1546 ConcurrentMark::ParCleanupThreadState**
ysr@777 1547 par_cleanup_thread_state) :
ysr@777 1548 AbstractGangTask("G1 note end"), _g1h(g1h),
ysr@777 1549 _max_live_bytes(0), _freed_bytes(0),
ysr@777 1550 _par_cleanup_thread_state(par_cleanup_thread_state)
ysr@777 1551 {}
ysr@777 1552
ysr@777 1553 void work(int i) {
ysr@777 1554 double start = os::elapsedTime();
ysr@777 1555 G1NoteEndOfConcMarkClosure g1_note_end(_g1h,
ysr@777 1556 &_par_cleanup_thread_state[i]->list,
ysr@777 1557 i);
ysr@777 1558 if (ParallelGCThreads > 0) {
tonyp@790 1559 _g1h->heap_region_par_iterate_chunked(&g1_note_end, i,
tonyp@790 1560 HeapRegion::NoteEndClaimValue);
ysr@777 1561 } else {
ysr@777 1562 _g1h->heap_region_iterate(&g1_note_end);
ysr@777 1563 }
ysr@777 1564 assert(g1_note_end.complete(), "Shouldn't have yielded!");
ysr@777 1565
ysr@777 1566 // Now finish up freeing the current thread's regions.
ysr@777 1567 _g1h->finish_free_region_work(g1_note_end.freed_bytes(),
ysr@777 1568 g1_note_end.cleared_h_regions(),
ysr@777 1569 0, NULL);
ysr@777 1570 {
ysr@777 1571 MutexLockerEx x(ParGCRareEvent_lock, Mutex::_no_safepoint_check_flag);
ysr@777 1572 _max_live_bytes += g1_note_end.max_live_bytes();
ysr@777 1573 _freed_bytes += g1_note_end.freed_bytes();
ysr@777 1574 }
ysr@777 1575 double end = os::elapsedTime();
ysr@777 1576 if (G1PrintParCleanupStats) {
ysr@777 1577 gclog_or_tty->print(" Worker thread %d [%8.3f..%8.3f = %8.3f ms] "
ysr@777 1578 "claimed %d regions (tot = %8.3f ms, max = %8.3f ms).\n",
ysr@777 1579 i, start, end, (end-start)*1000.0,
ysr@777 1580 g1_note_end.regions_claimed(),
ysr@777 1581 g1_note_end.claimed_region_time_sec()*1000.0,
ysr@777 1582 g1_note_end.max_region_time_sec()*1000.0);
ysr@777 1583 }
ysr@777 1584 }
ysr@777 1585 size_t max_live_bytes() { return _max_live_bytes; }
ysr@777 1586 size_t freed_bytes() { return _freed_bytes; }
ysr@777 1587 };
ysr@777 1588
ysr@777 1589 class G1ParScrubRemSetTask: public AbstractGangTask {
ysr@777 1590 protected:
ysr@777 1591 G1RemSet* _g1rs;
ysr@777 1592 BitMap* _region_bm;
ysr@777 1593 BitMap* _card_bm;
ysr@777 1594 public:
ysr@777 1595 G1ParScrubRemSetTask(G1CollectedHeap* g1h,
ysr@777 1596 BitMap* region_bm, BitMap* card_bm) :
ysr@777 1597 AbstractGangTask("G1 ScrubRS"), _g1rs(g1h->g1_rem_set()),
ysr@777 1598 _region_bm(region_bm), _card_bm(card_bm)
ysr@777 1599 {}
ysr@777 1600
ysr@777 1601 void work(int i) {
ysr@777 1602 if (ParallelGCThreads > 0) {
tonyp@790 1603 _g1rs->scrub_par(_region_bm, _card_bm, i,
tonyp@790 1604 HeapRegion::ScrubRemSetClaimValue);
ysr@777 1605 } else {
ysr@777 1606 _g1rs->scrub(_region_bm, _card_bm);
ysr@777 1607 }
ysr@777 1608 }
ysr@777 1609
ysr@777 1610 };
ysr@777 1611
ysr@777 1612 G1NoteEndOfConcMarkClosure::
ysr@777 1613 G1NoteEndOfConcMarkClosure(G1CollectedHeap* g1,
ysr@777 1614 UncleanRegionList* list,
ysr@777 1615 int worker_num)
ysr@777 1616 : _g1(g1), _worker_num(worker_num),
ysr@777 1617 _max_live_bytes(0), _regions_claimed(0),
ysr@777 1618 _freed_bytes(0), _cleared_h_regions(0), _freed_regions(0),
ysr@777 1619 _claimed_region_time(0.0), _max_region_time(0.0),
ysr@777 1620 _unclean_region_list(list)
ysr@777 1621 {}
ysr@777 1622
ysr@777 1623 bool G1NoteEndOfConcMarkClosure::doHeapRegion(HeapRegion *r) {
ysr@777 1624 // We use a claim value of zero here because all regions
ysr@777 1625 // were claimed with value 1 in the FinalCount task.
ysr@777 1626 r->reset_gc_time_stamp();
ysr@777 1627 if (!r->continuesHumongous()) {
ysr@777 1628 double start = os::elapsedTime();
ysr@777 1629 _regions_claimed++;
ysr@777 1630 r->note_end_of_marking();
ysr@777 1631 _max_live_bytes += r->max_live_bytes();
ysr@777 1632 _g1->free_region_if_totally_empty_work(r,
ysr@777 1633 _freed_bytes,
ysr@777 1634 _cleared_h_regions,
ysr@777 1635 _freed_regions,
ysr@777 1636 _unclean_region_list,
ysr@777 1637 true /*par*/);
ysr@777 1638 double region_time = (os::elapsedTime() - start);
ysr@777 1639 _claimed_region_time += region_time;
ysr@777 1640 if (region_time > _max_region_time) _max_region_time = region_time;
ysr@777 1641 }
ysr@777 1642 return false;
ysr@777 1643 }
ysr@777 1644
ysr@777 1645 void ConcurrentMark::cleanup() {
ysr@777 1646 // world is stopped at this checkpoint
ysr@777 1647 assert(SafepointSynchronize::is_at_safepoint(),
ysr@777 1648 "world should be stopped");
ysr@777 1649 G1CollectedHeap* g1h = G1CollectedHeap::heap();
ysr@777 1650
ysr@777 1651 // If a full collection has happened, we shouldn't do this.
ysr@777 1652 if (has_aborted()) {
ysr@777 1653 g1h->set_marking_complete(); // So bitmap clearing isn't confused
ysr@777 1654 return;
ysr@777 1655 }
ysr@777 1656
ysr@1280 1657 if (VerifyDuringGC) {
ysr@1280 1658 HandleMark hm; // handle scope
ysr@1280 1659 gclog_or_tty->print(" VerifyDuringGC:(before)");
ysr@1280 1660 Universe::heap()->prepare_for_verify();
ysr@1280 1661 Universe::verify(/* allow dirty */ true,
ysr@1280 1662 /* silent */ false,
ysr@1280 1663 /* prev marking */ true);
ysr@1280 1664 }
ysr@1280 1665
ysr@777 1666 _cleanup_co_tracker.disable();
ysr@777 1667
ysr@777 1668 G1CollectorPolicy* g1p = G1CollectedHeap::heap()->g1_policy();
ysr@777 1669 g1p->record_concurrent_mark_cleanup_start();
ysr@777 1670
ysr@777 1671 double start = os::elapsedTime();
ysr@777 1672 GCOverheadReporter::recordSTWStart(start);
ysr@777 1673
ysr@777 1674 // Do counting once more with the world stopped for good measure.
ysr@777 1675 G1ParFinalCountTask g1_par_count_task(g1h, nextMarkBitMap(),
ysr@777 1676 &_region_bm, &_card_bm);
ysr@777 1677 if (ParallelGCThreads > 0) {
tonyp@790 1678 assert(g1h->check_heap_region_claim_values(
tonyp@790 1679 HeapRegion::InitialClaimValue),
tonyp@790 1680 "sanity check");
tonyp@790 1681
ysr@777 1682 int n_workers = g1h->workers()->total_workers();
ysr@777 1683 g1h->set_par_threads(n_workers);
ysr@777 1684 g1h->workers()->run_task(&g1_par_count_task);
ysr@777 1685 g1h->set_par_threads(0);
tonyp@790 1686
tonyp@790 1687 assert(g1h->check_heap_region_claim_values(
tonyp@790 1688 HeapRegion::FinalCountClaimValue),
tonyp@790 1689 "sanity check");
ysr@777 1690 } else {
ysr@777 1691 g1_par_count_task.work(0);
ysr@777 1692 }
ysr@777 1693
ysr@777 1694 size_t known_garbage_bytes =
ysr@777 1695 g1_par_count_task.used_bytes() - g1_par_count_task.live_bytes();
ysr@777 1696 #if 0
ysr@777 1697 gclog_or_tty->print_cr("used %1.2lf, live %1.2lf, garbage %1.2lf",
ysr@777 1698 (double) g1_par_count_task.used_bytes() / (double) (1024 * 1024),
ysr@777 1699 (double) g1_par_count_task.live_bytes() / (double) (1024 * 1024),
ysr@777 1700 (double) known_garbage_bytes / (double) (1024 * 1024));
ysr@777 1701 #endif // 0
ysr@777 1702 g1p->set_known_garbage_bytes(known_garbage_bytes);
ysr@777 1703
ysr@777 1704 size_t start_used_bytes = g1h->used();
ysr@777 1705 _at_least_one_mark_complete = true;
ysr@777 1706 g1h->set_marking_complete();
ysr@777 1707
ysr@777 1708 double count_end = os::elapsedTime();
ysr@777 1709 double this_final_counting_time = (count_end - start);
ysr@777 1710 if (G1PrintParCleanupStats) {
ysr@777 1711 gclog_or_tty->print_cr("Cleanup:");
ysr@777 1712 gclog_or_tty->print_cr(" Finalize counting: %8.3f ms",
ysr@777 1713 this_final_counting_time*1000.0);
ysr@777 1714 }
ysr@777 1715 _total_counting_time += this_final_counting_time;
ysr@777 1716
ysr@777 1717 // Install newly created mark bitMap as "prev".
ysr@777 1718 swapMarkBitMaps();
ysr@777 1719
ysr@777 1720 g1h->reset_gc_time_stamp();
ysr@777 1721
ysr@777 1722 // Note end of marking in all heap regions.
ysr@777 1723 double note_end_start = os::elapsedTime();
ysr@777 1724 G1ParNoteEndTask g1_par_note_end_task(g1h, _par_cleanup_thread_state);
ysr@777 1725 if (ParallelGCThreads > 0) {
ysr@777 1726 int n_workers = g1h->workers()->total_workers();
ysr@777 1727 g1h->set_par_threads(n_workers);
ysr@777 1728 g1h->workers()->run_task(&g1_par_note_end_task);
ysr@777 1729 g1h->set_par_threads(0);
tonyp@790 1730
tonyp@790 1731 assert(g1h->check_heap_region_claim_values(HeapRegion::NoteEndClaimValue),
tonyp@790 1732 "sanity check");
ysr@777 1733 } else {
ysr@777 1734 g1_par_note_end_task.work(0);
ysr@777 1735 }
ysr@777 1736 g1h->set_unclean_regions_coming(true);
ysr@777 1737 double note_end_end = os::elapsedTime();
ysr@777 1738 // Tell the mutators that there might be unclean regions coming...
ysr@777 1739 if (G1PrintParCleanupStats) {
ysr@777 1740 gclog_or_tty->print_cr(" note end of marking: %8.3f ms.",
ysr@777 1741 (note_end_end - note_end_start)*1000.0);
ysr@777 1742 }
ysr@777 1743
tonyp@790 1744
ysr@777 1745 // call below, since it affects the metric by which we sort the heap
ysr@777 1746 // regions.
ysr@777 1747 if (G1ScrubRemSets) {
ysr@777 1748 double rs_scrub_start = os::elapsedTime();
ysr@777 1749 G1ParScrubRemSetTask g1_par_scrub_rs_task(g1h, &_region_bm, &_card_bm);
ysr@777 1750 if (ParallelGCThreads > 0) {
ysr@777 1751 int n_workers = g1h->workers()->total_workers();
ysr@777 1752 g1h->set_par_threads(n_workers);
ysr@777 1753 g1h->workers()->run_task(&g1_par_scrub_rs_task);
ysr@777 1754 g1h->set_par_threads(0);
tonyp@790 1755
tonyp@790 1756 assert(g1h->check_heap_region_claim_values(
tonyp@790 1757 HeapRegion::ScrubRemSetClaimValue),
tonyp@790 1758 "sanity check");
ysr@777 1759 } else {
ysr@777 1760 g1_par_scrub_rs_task.work(0);
ysr@777 1761 }
ysr@777 1762
ysr@777 1763 double rs_scrub_end = os::elapsedTime();
ysr@777 1764 double this_rs_scrub_time = (rs_scrub_end - rs_scrub_start);
ysr@777 1765 _total_rs_scrub_time += this_rs_scrub_time;
ysr@777 1766 }
ysr@777 1767
ysr@777 1768 // this will also free any regions totally full of garbage objects,
ysr@777 1769 // and sort the regions.
ysr@777 1770 g1h->g1_policy()->record_concurrent_mark_cleanup_end(
ysr@777 1771 g1_par_note_end_task.freed_bytes(),
ysr@777 1772 g1_par_note_end_task.max_live_bytes());
ysr@777 1773
ysr@777 1774 // Statistics.
ysr@777 1775 double end = os::elapsedTime();
ysr@777 1776 _cleanup_times.add((end - start) * 1000.0);
ysr@777 1777 GCOverheadReporter::recordSTWEnd(end);
ysr@777 1778
ysr@777 1779 // G1CollectedHeap::heap()->print();
ysr@777 1780 // gclog_or_tty->print_cr("HEAP GC TIME STAMP : %d",
ysr@777 1781 // G1CollectedHeap::heap()->get_gc_time_stamp());
ysr@777 1782
ysr@777 1783 if (PrintGC || PrintGCDetails) {
ysr@777 1784 g1h->print_size_transition(gclog_or_tty,
ysr@777 1785 start_used_bytes,
ysr@777 1786 g1h->used(),
ysr@777 1787 g1h->capacity());
ysr@777 1788 }
ysr@777 1789
ysr@777 1790 size_t cleaned_up_bytes = start_used_bytes - g1h->used();
ysr@777 1791 g1p->decrease_known_garbage_bytes(cleaned_up_bytes);
ysr@777 1792
ysr@777 1793 // We need to make this be a "collection" so any collection pause that
ysr@777 1794 // races with it goes around and waits for completeCleanup to finish.
ysr@777 1795 g1h->increment_total_collections();
ysr@777 1796
johnc@1186 1797 if (VerifyDuringGC) {
ysr@1280 1798 HandleMark hm; // handle scope
ysr@1280 1799 gclog_or_tty->print(" VerifyDuringGC:(after)");
ysr@1280 1800 Universe::heap()->prepare_for_verify();
ysr@1280 1801 Universe::verify(/* allow dirty */ true,
ysr@1280 1802 /* silent */ false,
ysr@1280 1803 /* prev marking */ true);
ysr@777 1804 }
ysr@777 1805 }
ysr@777 1806
ysr@777 1807 void ConcurrentMark::completeCleanup() {
ysr@777 1808 // A full collection intervened.
ysr@777 1809 if (has_aborted()) return;
ysr@777 1810
ysr@777 1811 int first = 0;
ysr@777 1812 int last = (int)MAX2(ParallelGCThreads, (size_t)1);
ysr@777 1813 for (int t = 0; t < last; t++) {
ysr@777 1814 UncleanRegionList* list = &_par_cleanup_thread_state[t]->list;
ysr@777 1815 assert(list->well_formed(), "Inv");
ysr@777 1816 HeapRegion* hd = list->hd();
ysr@777 1817 while (hd != NULL) {
ysr@777 1818 // Now finish up the other stuff.
ysr@777 1819 hd->rem_set()->clear();
ysr@777 1820 HeapRegion* next_hd = hd->next_from_unclean_list();
ysr@777 1821 (void)list->pop();
ysr@777 1822 guarantee(list->hd() == next_hd, "how not?");
ysr@777 1823 _g1h->put_region_on_unclean_list(hd);
ysr@777 1824 if (!hd->isHumongous()) {
ysr@777 1825 // Add this to the _free_regions count by 1.
ysr@777 1826 _g1h->finish_free_region_work(0, 0, 1, NULL);
ysr@777 1827 }
ysr@777 1828 hd = list->hd();
ysr@777 1829 guarantee(hd == next_hd, "how not?");
ysr@777 1830 }
ysr@777 1831 }
ysr@777 1832 }
ysr@777 1833
ysr@777 1834
ysr@777 1835 class G1CMIsAliveClosure: public BoolObjectClosure {
ysr@777 1836 G1CollectedHeap* _g1;
ysr@777 1837 public:
ysr@777 1838 G1CMIsAliveClosure(G1CollectedHeap* g1) :
ysr@777 1839 _g1(g1)
ysr@777 1840 {}
ysr@777 1841
ysr@777 1842 void do_object(oop obj) {
ysr@777 1843 assert(false, "not to be invoked");
ysr@777 1844 }
ysr@777 1845 bool do_object_b(oop obj) {
ysr@777 1846 HeapWord* addr = (HeapWord*)obj;
ysr@777 1847 return addr != NULL &&
ysr@777 1848 (!_g1->is_in_g1_reserved(addr) || !_g1->is_obj_ill(obj));
ysr@777 1849 }
ysr@777 1850 };
ysr@777 1851
ysr@777 1852 class G1CMKeepAliveClosure: public OopClosure {
ysr@777 1853 G1CollectedHeap* _g1;
ysr@777 1854 ConcurrentMark* _cm;
ysr@777 1855 CMBitMap* _bitMap;
ysr@777 1856 public:
ysr@777 1857 G1CMKeepAliveClosure(G1CollectedHeap* g1, ConcurrentMark* cm,
ysr@777 1858 CMBitMap* bitMap) :
ysr@777 1859 _g1(g1), _cm(cm),
ysr@777 1860 _bitMap(bitMap) {}
ysr@777 1861
ysr@1280 1862 virtual void do_oop(narrowOop* p) { do_oop_work(p); }
ysr@1280 1863 virtual void do_oop( oop* p) { do_oop_work(p); }
ysr@1280 1864
ysr@1280 1865 template <class T> void do_oop_work(T* p) {
ysr@1280 1866 oop thisOop = oopDesc::load_decode_heap_oop(p);
ysr@777 1867 HeapWord* addr = (HeapWord*)thisOop;
ysr@777 1868 if (_g1->is_in_g1_reserved(addr) && _g1->is_obj_ill(thisOop)) {
ysr@777 1869 _bitMap->mark(addr);
ysr@777 1870 _cm->mark_stack_push(thisOop);
ysr@777 1871 }
ysr@777 1872 }
ysr@777 1873 };
ysr@777 1874
ysr@777 1875 class G1CMDrainMarkingStackClosure: public VoidClosure {
ysr@777 1876 CMMarkStack* _markStack;
ysr@777 1877 CMBitMap* _bitMap;
ysr@777 1878 G1CMKeepAliveClosure* _oopClosure;
ysr@777 1879 public:
ysr@777 1880 G1CMDrainMarkingStackClosure(CMBitMap* bitMap, CMMarkStack* markStack,
ysr@777 1881 G1CMKeepAliveClosure* oopClosure) :
ysr@777 1882 _bitMap(bitMap),
ysr@777 1883 _markStack(markStack),
ysr@777 1884 _oopClosure(oopClosure)
ysr@777 1885 {}
ysr@777 1886
ysr@777 1887 void do_void() {
ysr@777 1888 _markStack->drain((OopClosure*)_oopClosure, _bitMap, false);
ysr@777 1889 }
ysr@777 1890 };
ysr@777 1891
ysr@777 1892 void ConcurrentMark::weakRefsWork(bool clear_all_soft_refs) {
ysr@777 1893 ResourceMark rm;
ysr@777 1894 HandleMark hm;
ysr@888 1895 G1CollectedHeap* g1h = G1CollectedHeap::heap();
ysr@888 1896 ReferenceProcessor* rp = g1h->ref_processor();
ysr@777 1897
ysr@777 1898 // Process weak references.
ysr@892 1899 rp->setup_policy(clear_all_soft_refs);
ysr@777 1900 assert(_markStack.isEmpty(), "mark stack should be empty");
ysr@777 1901
ysr@888 1902 G1CMIsAliveClosure g1IsAliveClosure (g1h);
ysr@888 1903 G1CMKeepAliveClosure g1KeepAliveClosure(g1h, this, nextMarkBitMap());
ysr@777 1904 G1CMDrainMarkingStackClosure
ysr@777 1905 g1DrainMarkingStackClosure(nextMarkBitMap(), &_markStack,
ysr@777 1906 &g1KeepAliveClosure);
ysr@777 1907
ysr@777 1908 // XXXYYY Also: copy the parallel ref processing code from CMS.
ysr@888 1909 rp->process_discovered_references(&g1IsAliveClosure,
ysr@777 1910 &g1KeepAliveClosure,
ysr@777 1911 &g1DrainMarkingStackClosure,
ysr@777 1912 NULL);
ysr@777 1913 assert(_markStack.overflow() || _markStack.isEmpty(),
ysr@777 1914 "mark stack should be empty (unless it overflowed)");
ysr@777 1915 if (_markStack.overflow()) {
ysr@777 1916 set_has_overflown();
ysr@777 1917 }
ysr@777 1918
ysr@777 1919 rp->enqueue_discovered_references();
ysr@777 1920 rp->verify_no_references_recorded();
ysr@777 1921 assert(!rp->discovery_enabled(), "should have been disabled");
ysr@777 1922
ysr@777 1923 // Now clean up stale oops in SymbolTable and StringTable
ysr@777 1924 SymbolTable::unlink(&g1IsAliveClosure);
ysr@777 1925 StringTable::unlink(&g1IsAliveClosure);
ysr@777 1926 }
ysr@777 1927
ysr@777 1928 void ConcurrentMark::swapMarkBitMaps() {
ysr@777 1929 CMBitMapRO* temp = _prevMarkBitMap;
ysr@777 1930 _prevMarkBitMap = (CMBitMapRO*)_nextMarkBitMap;
ysr@777 1931 _nextMarkBitMap = (CMBitMap*) temp;
ysr@777 1932 }
ysr@777 1933
ysr@777 1934 class CMRemarkTask: public AbstractGangTask {
ysr@777 1935 private:
ysr@777 1936 ConcurrentMark *_cm;
ysr@777 1937
ysr@777 1938 public:
ysr@777 1939 void work(int worker_i) {
ysr@777 1940 // Since all available tasks are actually started, we should
ysr@777 1941 // only proceed if we're supposed to be actived.
ysr@777 1942 if ((size_t)worker_i < _cm->active_tasks()) {
ysr@777 1943 CMTask* task = _cm->task(worker_i);
ysr@777 1944 task->record_start_time();
ysr@777 1945 do {
ysr@777 1946 task->do_marking_step(1000000000.0 /* something very large */);
ysr@777 1947 } while (task->has_aborted() && !_cm->has_overflown());
ysr@777 1948 // If we overflow, then we do not want to restart. We instead
ysr@777 1949 // want to abort remark and do concurrent marking again.
ysr@777 1950 task->record_end_time();
ysr@777 1951 }
ysr@777 1952 }
ysr@777 1953
ysr@777 1954 CMRemarkTask(ConcurrentMark* cm) :
ysr@777 1955 AbstractGangTask("Par Remark"), _cm(cm) { }
ysr@777 1956 };
ysr@777 1957
ysr@777 1958 void ConcurrentMark::checkpointRootsFinalWork() {
ysr@777 1959 ResourceMark rm;
ysr@777 1960 HandleMark hm;
ysr@777 1961 G1CollectedHeap* g1h = G1CollectedHeap::heap();
ysr@777 1962
ysr@777 1963 g1h->ensure_parsability(false);
ysr@777 1964
ysr@777 1965 if (ParallelGCThreads > 0) {
ysr@777 1966 g1h->change_strong_roots_parity();
ysr@777 1967 // this is remark, so we'll use up all available threads
ysr@777 1968 int active_workers = ParallelGCThreads;
ysr@777 1969 set_phase(active_workers, false);
ysr@777 1970
ysr@777 1971 CMRemarkTask remarkTask(this);
ysr@777 1972 // We will start all available threads, even if we decide that the
ysr@777 1973 // active_workers will be fewer. The extra ones will just bail out
ysr@777 1974 // immediately.
ysr@777 1975 int n_workers = g1h->workers()->total_workers();
ysr@777 1976 g1h->set_par_threads(n_workers);
ysr@777 1977 g1h->workers()->run_task(&remarkTask);
ysr@777 1978 g1h->set_par_threads(0);
ysr@777 1979
ysr@777 1980 SATBMarkQueueSet& satb_mq_set = JavaThread::satb_mark_queue_set();
ysr@777 1981 guarantee( satb_mq_set.completed_buffers_num() == 0, "invariant" );
ysr@777 1982 } else {
ysr@777 1983 g1h->change_strong_roots_parity();
ysr@777 1984 // this is remark, so we'll use up all available threads
ysr@777 1985 int active_workers = 1;
ysr@777 1986 set_phase(active_workers, false);
ysr@777 1987
ysr@777 1988 CMRemarkTask remarkTask(this);
ysr@777 1989 // We will start all available threads, even if we decide that the
ysr@777 1990 // active_workers will be fewer. The extra ones will just bail out
ysr@777 1991 // immediately.
ysr@777 1992 remarkTask.work(0);
ysr@777 1993
ysr@777 1994 SATBMarkQueueSet& satb_mq_set = JavaThread::satb_mark_queue_set();
ysr@777 1995 guarantee( satb_mq_set.completed_buffers_num() == 0, "invariant" );
ysr@777 1996 }
ysr@777 1997
ysr@777 1998 print_stats();
ysr@777 1999
ysr@777 2000 if (!restart_for_overflow())
ysr@777 2001 set_non_marking_state();
ysr@777 2002
ysr@777 2003 #if VERIFY_OBJS_PROCESSED
ysr@777 2004 if (_scan_obj_cl.objs_processed != ThreadLocalObjQueue::objs_enqueued) {
ysr@777 2005 gclog_or_tty->print_cr("Processed = %d, enqueued = %d.",
ysr@777 2006 _scan_obj_cl.objs_processed,
ysr@777 2007 ThreadLocalObjQueue::objs_enqueued);
ysr@777 2008 guarantee(_scan_obj_cl.objs_processed ==
ysr@777 2009 ThreadLocalObjQueue::objs_enqueued,
ysr@777 2010 "Different number of objs processed and enqueued.");
ysr@777 2011 }
ysr@777 2012 #endif
ysr@777 2013 }
ysr@777 2014
ysr@777 2015 class ReachablePrinterOopClosure: public OopClosure {
ysr@777 2016 private:
ysr@777 2017 G1CollectedHeap* _g1h;
ysr@777 2018 CMBitMapRO* _bitmap;
ysr@777 2019 outputStream* _out;
ysr@777 2020
ysr@777 2021 public:
ysr@777 2022 ReachablePrinterOopClosure(CMBitMapRO* bitmap, outputStream* out) :
ysr@777 2023 _bitmap(bitmap), _g1h(G1CollectedHeap::heap()), _out(out) { }
ysr@777 2024
ysr@1280 2025 void do_oop(narrowOop* p) { do_oop_work(p); }
ysr@1280 2026 void do_oop( oop* p) { do_oop_work(p); }
ysr@1280 2027
ysr@1280 2028 template <class T> void do_oop_work(T* p) {
ysr@1280 2029 oop obj = oopDesc::load_decode_heap_oop(p);
ysr@777 2030 const char* str = NULL;
ysr@777 2031 const char* str2 = "";
ysr@777 2032
ysr@777 2033 if (!_g1h->is_in_g1_reserved(obj))
ysr@777 2034 str = "outside G1 reserved";
ysr@777 2035 else {
ysr@777 2036 HeapRegion* hr = _g1h->heap_region_containing(obj);
ysr@777 2037 guarantee( hr != NULL, "invariant" );
ysr@777 2038 if (hr->obj_allocated_since_prev_marking(obj)) {
ysr@777 2039 str = "over TAMS";
ysr@777 2040 if (_bitmap->isMarked((HeapWord*) obj))
ysr@777 2041 str2 = " AND MARKED";
ysr@777 2042 } else if (_bitmap->isMarked((HeapWord*) obj))
ysr@777 2043 str = "marked";
ysr@777 2044 else
ysr@777 2045 str = "#### NOT MARKED ####";
ysr@777 2046 }
ysr@777 2047
ysr@777 2048 _out->print_cr(" "PTR_FORMAT" contains "PTR_FORMAT" %s%s",
ysr@777 2049 p, (void*) obj, str, str2);
ysr@777 2050 }
ysr@777 2051 };
ysr@777 2052
ysr@777 2053 class ReachablePrinterClosure: public BitMapClosure {
ysr@777 2054 private:
ysr@777 2055 CMBitMapRO* _bitmap;
ysr@777 2056 outputStream* _out;
ysr@777 2057
ysr@777 2058 public:
ysr@777 2059 ReachablePrinterClosure(CMBitMapRO* bitmap, outputStream* out) :
ysr@777 2060 _bitmap(bitmap), _out(out) { }
ysr@777 2061
ysr@777 2062 bool do_bit(size_t offset) {
ysr@777 2063 HeapWord* addr = _bitmap->offsetToHeapWord(offset);
ysr@777 2064 ReachablePrinterOopClosure oopCl(_bitmap, _out);
ysr@777 2065
ysr@777 2066 _out->print_cr(" obj "PTR_FORMAT", offset %10d (marked)", addr, offset);
ysr@777 2067 oop(addr)->oop_iterate(&oopCl);
ysr@777 2068 _out->print_cr("");
ysr@777 2069
ysr@777 2070 return true;
ysr@777 2071 }
ysr@777 2072 };
ysr@777 2073
ysr@777 2074 class ObjInRegionReachablePrinterClosure : public ObjectClosure {
ysr@777 2075 private:
ysr@777 2076 CMBitMapRO* _bitmap;
ysr@777 2077 outputStream* _out;
ysr@777 2078
ysr@777 2079 public:
ysr@777 2080 void do_object(oop o) {
ysr@777 2081 ReachablePrinterOopClosure oopCl(_bitmap, _out);
ysr@777 2082
ysr@777 2083 _out->print_cr(" obj "PTR_FORMAT" (over TAMS)", (void*) o);
ysr@777 2084 o->oop_iterate(&oopCl);
ysr@777 2085 _out->print_cr("");
ysr@777 2086 }
ysr@777 2087
ysr@777 2088 ObjInRegionReachablePrinterClosure(CMBitMapRO* bitmap, outputStream* out) :
ysr@777 2089 _bitmap(bitmap), _out(out) { }
ysr@777 2090 };
ysr@777 2091
ysr@777 2092 class RegionReachablePrinterClosure : public HeapRegionClosure {
ysr@777 2093 private:
ysr@777 2094 CMBitMapRO* _bitmap;
ysr@777 2095 outputStream* _out;
ysr@777 2096
ysr@777 2097 public:
ysr@777 2098 bool doHeapRegion(HeapRegion* hr) {
ysr@777 2099 HeapWord* b = hr->bottom();
ysr@777 2100 HeapWord* e = hr->end();
ysr@777 2101 HeapWord* t = hr->top();
ysr@777 2102 HeapWord* p = hr->prev_top_at_mark_start();
ysr@777 2103 _out->print_cr("** ["PTR_FORMAT", "PTR_FORMAT"] top: "PTR_FORMAT" "
ysr@777 2104 "PTAMS: "PTR_FORMAT, b, e, t, p);
ysr@777 2105 _out->print_cr("");
ysr@777 2106
ysr@777 2107 ObjInRegionReachablePrinterClosure ocl(_bitmap, _out);
ysr@777 2108 hr->object_iterate_mem_careful(MemRegion(p, t), &ocl);
ysr@777 2109
ysr@777 2110 return false;
ysr@777 2111 }
ysr@777 2112
ysr@777 2113 RegionReachablePrinterClosure(CMBitMapRO* bitmap,
ysr@777 2114 outputStream* out) :
ysr@777 2115 _bitmap(bitmap), _out(out) { }
ysr@777 2116 };
ysr@777 2117
ysr@777 2118 void ConcurrentMark::print_prev_bitmap_reachable() {
ysr@777 2119 outputStream* out = gclog_or_tty;
ysr@777 2120
ysr@777 2121 #if SEND_HEAP_DUMP_TO_FILE
ysr@777 2122 guarantee(heap_dump_file == NULL, "Protocol");
ysr@777 2123 char fn_buf[100];
ysr@777 2124 sprintf(fn_buf, "/tmp/dump.txt.%d", os::current_process_id());
ysr@777 2125 heap_dump_file = fopen(fn_buf, "w");
ysr@777 2126 fileStream fstream(heap_dump_file);
ysr@777 2127 out = &fstream;
ysr@777 2128 #endif // SEND_HEAP_DUMP_TO_FILE
ysr@777 2129
ysr@777 2130 RegionReachablePrinterClosure rcl(_prevMarkBitMap, out);
ysr@777 2131 out->print_cr("--- ITERATING OVER REGIONS WITH PTAMS < TOP");
ysr@777 2132 _g1h->heap_region_iterate(&rcl);
ysr@777 2133 out->print_cr("");
ysr@777 2134
ysr@777 2135 ReachablePrinterClosure cl(_prevMarkBitMap, out);
ysr@777 2136 out->print_cr("--- REACHABLE OBJECTS ON THE BITMAP");
ysr@777 2137 _prevMarkBitMap->iterate(&cl);
ysr@777 2138 out->print_cr("");
ysr@777 2139
ysr@777 2140 #if SEND_HEAP_DUMP_TO_FILE
ysr@777 2141 fclose(heap_dump_file);
ysr@777 2142 heap_dump_file = NULL;
ysr@777 2143 #endif // SEND_HEAP_DUMP_TO_FILE
ysr@777 2144 }
ysr@777 2145
ysr@777 2146 // This note is for drainAllSATBBuffers and the code in between.
ysr@777 2147 // In the future we could reuse a task to do this work during an
ysr@777 2148 // evacuation pause (since now tasks are not active and can be claimed
ysr@777 2149 // during an evacuation pause). This was a late change to the code and
ysr@777 2150 // is currently not being taken advantage of.
ysr@777 2151
ysr@777 2152 class CMGlobalObjectClosure : public ObjectClosure {
ysr@777 2153 private:
ysr@777 2154 ConcurrentMark* _cm;
ysr@777 2155
ysr@777 2156 public:
ysr@777 2157 void do_object(oop obj) {
ysr@777 2158 _cm->deal_with_reference(obj);
ysr@777 2159 }
ysr@777 2160
ysr@777 2161 CMGlobalObjectClosure(ConcurrentMark* cm) : _cm(cm) { }
ysr@777 2162 };
ysr@777 2163
ysr@777 2164 void ConcurrentMark::deal_with_reference(oop obj) {
ysr@777 2165 if (verbose_high())
ysr@777 2166 gclog_or_tty->print_cr("[global] we're dealing with reference "PTR_FORMAT,
ysr@777 2167 (void*) obj);
ysr@777 2168
ysr@777 2169
ysr@777 2170 HeapWord* objAddr = (HeapWord*) obj;
ysr@1280 2171 assert(obj->is_oop_or_null(true /* ignore mark word */), "Error");
ysr@777 2172 if (_g1h->is_in_g1_reserved(objAddr)) {
ysr@777 2173 tmp_guarantee_CM( obj != NULL, "is_in_g1_reserved should ensure this" );
ysr@777 2174 HeapRegion* hr = _g1h->heap_region_containing(obj);
ysr@777 2175 if (_g1h->is_obj_ill(obj, hr)) {
ysr@777 2176 if (verbose_high())
ysr@777 2177 gclog_or_tty->print_cr("[global] "PTR_FORMAT" is not considered "
ysr@777 2178 "marked", (void*) obj);
ysr@777 2179
ysr@777 2180 // we need to mark it first
ysr@777 2181 if (_nextMarkBitMap->parMark(objAddr)) {
ysr@777 2182 // No OrderAccess:store_load() is needed. It is implicit in the
ysr@777 2183 // CAS done in parMark(objAddr) above
ysr@777 2184 HeapWord* finger = _finger;
ysr@777 2185 if (objAddr < finger) {
ysr@777 2186 if (verbose_high())
ysr@777 2187 gclog_or_tty->print_cr("[global] below the global finger "
ysr@777 2188 "("PTR_FORMAT"), pushing it", finger);
ysr@777 2189 if (!mark_stack_push(obj)) {
ysr@777 2190 if (verbose_low())
ysr@777 2191 gclog_or_tty->print_cr("[global] global stack overflow during "
ysr@777 2192 "deal_with_reference");
ysr@777 2193 }
ysr@777 2194 }
ysr@777 2195 }
ysr@777 2196 }
ysr@777 2197 }
ysr@777 2198 }
ysr@777 2199
ysr@777 2200 void ConcurrentMark::drainAllSATBBuffers() {
ysr@777 2201 CMGlobalObjectClosure oc(this);
ysr@777 2202 SATBMarkQueueSet& satb_mq_set = JavaThread::satb_mark_queue_set();
ysr@777 2203 satb_mq_set.set_closure(&oc);
ysr@777 2204
ysr@777 2205 while (satb_mq_set.apply_closure_to_completed_buffer()) {
ysr@777 2206 if (verbose_medium())
ysr@777 2207 gclog_or_tty->print_cr("[global] processed an SATB buffer");
ysr@777 2208 }
ysr@777 2209
ysr@777 2210 // no need to check whether we should do this, as this is only
ysr@777 2211 // called during an evacuation pause
ysr@777 2212 satb_mq_set.iterate_closure_all_threads();
ysr@777 2213
ysr@777 2214 satb_mq_set.set_closure(NULL);
ysr@777 2215 guarantee( satb_mq_set.completed_buffers_num() == 0, "invariant" );
ysr@777 2216 }
ysr@777 2217
ysr@777 2218 void ConcurrentMark::markPrev(oop p) {
ysr@777 2219 // Note we are overriding the read-only view of the prev map here, via
ysr@777 2220 // the cast.
ysr@777 2221 ((CMBitMap*)_prevMarkBitMap)->mark((HeapWord*)p);
ysr@777 2222 }
ysr@777 2223
ysr@777 2224 void ConcurrentMark::clear(oop p) {
ysr@777 2225 assert(p != NULL && p->is_oop(), "expected an oop");
ysr@777 2226 HeapWord* addr = (HeapWord*)p;
ysr@777 2227 assert(addr >= _nextMarkBitMap->startWord() ||
ysr@777 2228 addr < _nextMarkBitMap->endWord(), "in a region");
ysr@777 2229
ysr@777 2230 _nextMarkBitMap->clear(addr);
ysr@777 2231 }
ysr@777 2232
ysr@777 2233 void ConcurrentMark::clearRangeBothMaps(MemRegion mr) {
ysr@777 2234 // Note we are overriding the read-only view of the prev map here, via
ysr@777 2235 // the cast.
ysr@777 2236 ((CMBitMap*)_prevMarkBitMap)->clearRange(mr);
ysr@777 2237 _nextMarkBitMap->clearRange(mr);
ysr@777 2238 }
ysr@777 2239
ysr@777 2240 HeapRegion*
ysr@777 2241 ConcurrentMark::claim_region(int task_num) {
ysr@777 2242 // "checkpoint" the finger
ysr@777 2243 HeapWord* finger = _finger;
ysr@777 2244
ysr@777 2245 // _heap_end will not change underneath our feet; it only changes at
ysr@777 2246 // yield points.
ysr@777 2247 while (finger < _heap_end) {
ysr@777 2248 tmp_guarantee_CM( _g1h->is_in_g1_reserved(finger), "invariant" );
ysr@777 2249
ysr@777 2250 // is the gap between reading the finger and doing the CAS too long?
ysr@777 2251
ysr@777 2252 HeapRegion* curr_region = _g1h->heap_region_containing(finger);
ysr@777 2253 HeapWord* bottom = curr_region->bottom();
ysr@777 2254 HeapWord* end = curr_region->end();
ysr@777 2255 HeapWord* limit = curr_region->next_top_at_mark_start();
ysr@777 2256
ysr@777 2257 if (verbose_low())
ysr@777 2258 gclog_or_tty->print_cr("[%d] curr_region = "PTR_FORMAT" "
ysr@777 2259 "["PTR_FORMAT", "PTR_FORMAT"), "
ysr@777 2260 "limit = "PTR_FORMAT,
ysr@777 2261 task_num, curr_region, bottom, end, limit);
ysr@777 2262
ysr@777 2263 HeapWord* res =
ysr@777 2264 (HeapWord*) Atomic::cmpxchg_ptr(end, &_finger, finger);
ysr@777 2265 if (res == finger) {
ysr@777 2266 // we succeeded
ysr@777 2267
ysr@777 2268 // notice that _finger == end cannot be guaranteed here since,
ysr@777 2269 // someone else might have moved the finger even further
ysr@777 2270 guarantee( _finger >= end, "the finger should have moved forward" );
ysr@777 2271
ysr@777 2272 if (verbose_low())
ysr@777 2273 gclog_or_tty->print_cr("[%d] we were successful with region = "
ysr@777 2274 PTR_FORMAT, task_num, curr_region);
ysr@777 2275
ysr@777 2276 if (limit > bottom) {
ysr@777 2277 if (verbose_low())
ysr@777 2278 gclog_or_tty->print_cr("[%d] region "PTR_FORMAT" is not empty, "
ysr@777 2279 "returning it ", task_num, curr_region);
ysr@777 2280 return curr_region;
ysr@777 2281 } else {
ysr@777 2282 tmp_guarantee_CM( limit == bottom,
ysr@777 2283 "the region limit should be at bottom" );
ysr@777 2284 if (verbose_low())
ysr@777 2285 gclog_or_tty->print_cr("[%d] region "PTR_FORMAT" is empty, "
ysr@777 2286 "returning NULL", task_num, curr_region);
ysr@777 2287 // we return NULL and the caller should try calling
ysr@777 2288 // claim_region() again.
ysr@777 2289 return NULL;
ysr@777 2290 }
ysr@777 2291 } else {
ysr@777 2292 guarantee( _finger > finger, "the finger should have moved forward" );
ysr@777 2293 if (verbose_low())
ysr@777 2294 gclog_or_tty->print_cr("[%d] somebody else moved the finger, "
ysr@777 2295 "global finger = "PTR_FORMAT", "
ysr@777 2296 "our finger = "PTR_FORMAT,
ysr@777 2297 task_num, _finger, finger);
ysr@777 2298
ysr@777 2299 // read it again
ysr@777 2300 finger = _finger;
ysr@777 2301 }
ysr@777 2302 }
ysr@777 2303
ysr@777 2304 return NULL;
ysr@777 2305 }
ysr@777 2306
ysr@777 2307 void ConcurrentMark::oops_do(OopClosure* cl) {
ysr@777 2308 if (_markStack.size() > 0 && verbose_low())
ysr@777 2309 gclog_or_tty->print_cr("[global] scanning the global marking stack, "
ysr@777 2310 "size = %d", _markStack.size());
ysr@777 2311 // we first iterate over the contents of the mark stack...
ysr@777 2312 _markStack.oops_do(cl);
ysr@777 2313
ysr@777 2314 for (int i = 0; i < (int)_max_task_num; ++i) {
ysr@777 2315 OopTaskQueue* queue = _task_queues->queue((int)i);
ysr@777 2316
ysr@777 2317 if (queue->size() > 0 && verbose_low())
ysr@777 2318 gclog_or_tty->print_cr("[global] scanning task queue of task %d, "
ysr@777 2319 "size = %d", i, queue->size());
ysr@777 2320
ysr@777 2321 // ...then over the contents of the all the task queues.
ysr@777 2322 queue->oops_do(cl);
ysr@777 2323 }
ysr@777 2324
ysr@777 2325 // finally, invalidate any entries that in the region stack that
ysr@777 2326 // point into the collection set
ysr@777 2327 if (_regionStack.invalidate_entries_into_cset()) {
ysr@777 2328 // otherwise, any gray objects copied during the evacuation pause
ysr@777 2329 // might not be visited.
ysr@777 2330 guarantee( _should_gray_objects, "invariant" );
ysr@777 2331 }
ysr@777 2332 }
ysr@777 2333
ysr@777 2334 void ConcurrentMark::clear_marking_state() {
ysr@777 2335 _markStack.setEmpty();
ysr@777 2336 _markStack.clear_overflow();
ysr@777 2337 _regionStack.setEmpty();
ysr@777 2338 _regionStack.clear_overflow();
ysr@777 2339 clear_has_overflown();
ysr@777 2340 _finger = _heap_start;
ysr@777 2341
ysr@777 2342 for (int i = 0; i < (int)_max_task_num; ++i) {
ysr@777 2343 OopTaskQueue* queue = _task_queues->queue(i);
ysr@777 2344 queue->set_empty();
ysr@777 2345 }
ysr@777 2346 }
ysr@777 2347
ysr@777 2348 void ConcurrentMark::print_stats() {
ysr@777 2349 if (verbose_stats()) {
ysr@777 2350 gclog_or_tty->print_cr("---------------------------------------------------------------------");
ysr@777 2351 for (size_t i = 0; i < _active_tasks; ++i) {
ysr@777 2352 _tasks[i]->print_stats();
ysr@777 2353 gclog_or_tty->print_cr("---------------------------------------------------------------------");
ysr@777 2354 }
ysr@777 2355 }
ysr@777 2356 }
ysr@777 2357
ysr@777 2358 class CSMarkOopClosure: public OopClosure {
ysr@777 2359 friend class CSMarkBitMapClosure;
ysr@777 2360
ysr@777 2361 G1CollectedHeap* _g1h;
ysr@777 2362 CMBitMap* _bm;
ysr@777 2363 ConcurrentMark* _cm;
ysr@777 2364 oop* _ms;
ysr@777 2365 jint* _array_ind_stack;
ysr@777 2366 int _ms_size;
ysr@777 2367 int _ms_ind;
ysr@777 2368 int _array_increment;
ysr@777 2369
ysr@777 2370 bool push(oop obj, int arr_ind = 0) {
ysr@777 2371 if (_ms_ind == _ms_size) {
ysr@777 2372 gclog_or_tty->print_cr("Mark stack is full.");
ysr@777 2373 return false;
ysr@777 2374 }
ysr@777 2375 _ms[_ms_ind] = obj;
ysr@777 2376 if (obj->is_objArray()) _array_ind_stack[_ms_ind] = arr_ind;
ysr@777 2377 _ms_ind++;
ysr@777 2378 return true;
ysr@777 2379 }
ysr@777 2380
ysr@777 2381 oop pop() {
ysr@777 2382 if (_ms_ind == 0) return NULL;
ysr@777 2383 else {
ysr@777 2384 _ms_ind--;
ysr@777 2385 return _ms[_ms_ind];
ysr@777 2386 }
ysr@777 2387 }
ysr@777 2388
ysr@1280 2389 template <class T> bool drain() {
ysr@777 2390 while (_ms_ind > 0) {
ysr@777 2391 oop obj = pop();
ysr@777 2392 assert(obj != NULL, "Since index was non-zero.");
ysr@777 2393 if (obj->is_objArray()) {
ysr@777 2394 jint arr_ind = _array_ind_stack[_ms_ind];
ysr@777 2395 objArrayOop aobj = objArrayOop(obj);
ysr@777 2396 jint len = aobj->length();
ysr@777 2397 jint next_arr_ind = arr_ind + _array_increment;
ysr@777 2398 if (next_arr_ind < len) {
ysr@777 2399 push(obj, next_arr_ind);
ysr@777 2400 }
ysr@777 2401 // Now process this portion of this one.
ysr@777 2402 int lim = MIN2(next_arr_ind, len);
ysr@777 2403 for (int j = arr_ind; j < lim; j++) {
ysr@1280 2404 do_oop(aobj->obj_at_addr<T>(j));
ysr@777 2405 }
ysr@777 2406
ysr@777 2407 } else {
ysr@777 2408 obj->oop_iterate(this);
ysr@777 2409 }
ysr@777 2410 if (abort()) return false;
ysr@777 2411 }
ysr@777 2412 return true;
ysr@777 2413 }
ysr@777 2414
ysr@777 2415 public:
ysr@777 2416 CSMarkOopClosure(ConcurrentMark* cm, int ms_size) :
ysr@777 2417 _g1h(G1CollectedHeap::heap()),
ysr@777 2418 _cm(cm),
ysr@777 2419 _bm(cm->nextMarkBitMap()),
ysr@777 2420 _ms_size(ms_size), _ms_ind(0),
ysr@777 2421 _ms(NEW_C_HEAP_ARRAY(oop, ms_size)),
ysr@777 2422 _array_ind_stack(NEW_C_HEAP_ARRAY(jint, ms_size)),
ysr@777 2423 _array_increment(MAX2(ms_size/8, 16))
ysr@777 2424 {}
ysr@777 2425
ysr@777 2426 ~CSMarkOopClosure() {
ysr@777 2427 FREE_C_HEAP_ARRAY(oop, _ms);
ysr@777 2428 FREE_C_HEAP_ARRAY(jint, _array_ind_stack);
ysr@777 2429 }
ysr@777 2430
ysr@1280 2431 virtual void do_oop(narrowOop* p) { do_oop_work(p); }
ysr@1280 2432 virtual void do_oop( oop* p) { do_oop_work(p); }
ysr@1280 2433
ysr@1280 2434 template <class T> void do_oop_work(T* p) {
ysr@1280 2435 T heap_oop = oopDesc::load_heap_oop(p);
ysr@1280 2436 if (oopDesc::is_null(heap_oop)) return;
ysr@1280 2437 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
ysr@777 2438 if (obj->is_forwarded()) {
ysr@777 2439 // If the object has already been forwarded, we have to make sure
ysr@777 2440 // that it's marked. So follow the forwarding pointer. Note that
ysr@777 2441 // this does the right thing for self-forwarding pointers in the
ysr@777 2442 // evacuation failure case.
ysr@777 2443 obj = obj->forwardee();
ysr@777 2444 }
ysr@777 2445 HeapRegion* hr = _g1h->heap_region_containing(obj);
ysr@777 2446 if (hr != NULL) {
ysr@777 2447 if (hr->in_collection_set()) {
ysr@777 2448 if (_g1h->is_obj_ill(obj)) {
ysr@777 2449 _bm->mark((HeapWord*)obj);
ysr@777 2450 if (!push(obj)) {
ysr@777 2451 gclog_or_tty->print_cr("Setting abort in CSMarkOopClosure because push failed.");
ysr@777 2452 set_abort();
ysr@777 2453 }
ysr@777 2454 }
ysr@777 2455 } else {
ysr@777 2456 // Outside the collection set; we need to gray it
ysr@777 2457 _cm->deal_with_reference(obj);
ysr@777 2458 }
ysr@777 2459 }
ysr@777 2460 }
ysr@777 2461 };
ysr@777 2462
ysr@777 2463 class CSMarkBitMapClosure: public BitMapClosure {
ysr@777 2464 G1CollectedHeap* _g1h;
ysr@777 2465 CMBitMap* _bitMap;
ysr@777 2466 ConcurrentMark* _cm;
ysr@777 2467 CSMarkOopClosure _oop_cl;
ysr@777 2468 public:
ysr@777 2469 CSMarkBitMapClosure(ConcurrentMark* cm, int ms_size) :
ysr@777 2470 _g1h(G1CollectedHeap::heap()),
ysr@777 2471 _bitMap(cm->nextMarkBitMap()),
ysr@777 2472 _oop_cl(cm, ms_size)
ysr@777 2473 {}
ysr@777 2474
ysr@777 2475 ~CSMarkBitMapClosure() {}
ysr@777 2476
ysr@777 2477 bool do_bit(size_t offset) {
ysr@777 2478 // convert offset into a HeapWord*
ysr@777 2479 HeapWord* addr = _bitMap->offsetToHeapWord(offset);
ysr@777 2480 assert(_bitMap->endWord() && addr < _bitMap->endWord(),
ysr@777 2481 "address out of range");
ysr@777 2482 assert(_bitMap->isMarked(addr), "tautology");
ysr@777 2483 oop obj = oop(addr);
ysr@777 2484 if (!obj->is_forwarded()) {
ysr@777 2485 if (!_oop_cl.push(obj)) return false;
ysr@1280 2486 if (UseCompressedOops) {
ysr@1280 2487 if (!_oop_cl.drain<narrowOop>()) return false;
ysr@1280 2488 } else {
ysr@1280 2489 if (!_oop_cl.drain<oop>()) return false;
ysr@1280 2490 }
ysr@777 2491 }
ysr@777 2492 // Otherwise...
ysr@777 2493 return true;
ysr@777 2494 }
ysr@777 2495 };
ysr@777 2496
ysr@777 2497
ysr@777 2498 class CompleteMarkingInCSHRClosure: public HeapRegionClosure {
ysr@777 2499 CMBitMap* _bm;
ysr@777 2500 CSMarkBitMapClosure _bit_cl;
ysr@777 2501 enum SomePrivateConstants {
ysr@777 2502 MSSize = 1000
ysr@777 2503 };
ysr@777 2504 bool _completed;
ysr@777 2505 public:
ysr@777 2506 CompleteMarkingInCSHRClosure(ConcurrentMark* cm) :
ysr@777 2507 _bm(cm->nextMarkBitMap()),
ysr@777 2508 _bit_cl(cm, MSSize),
ysr@777 2509 _completed(true)
ysr@777 2510 {}
ysr@777 2511
ysr@777 2512 ~CompleteMarkingInCSHRClosure() {}
ysr@777 2513
ysr@777 2514 bool doHeapRegion(HeapRegion* r) {
ysr@777 2515 if (!r->evacuation_failed()) {
ysr@777 2516 MemRegion mr = MemRegion(r->bottom(), r->next_top_at_mark_start());
ysr@777 2517 if (!mr.is_empty()) {
ysr@777 2518 if (!_bm->iterate(&_bit_cl, mr)) {
ysr@777 2519 _completed = false;
ysr@777 2520 return true;
ysr@777 2521 }
ysr@777 2522 }
ysr@777 2523 }
ysr@777 2524 return false;
ysr@777 2525 }
ysr@777 2526
ysr@777 2527 bool completed() { return _completed; }
ysr@777 2528 };
ysr@777 2529
ysr@777 2530 class ClearMarksInHRClosure: public HeapRegionClosure {
ysr@777 2531 CMBitMap* _bm;
ysr@777 2532 public:
ysr@777 2533 ClearMarksInHRClosure(CMBitMap* bm): _bm(bm) { }
ysr@777 2534
ysr@777 2535 bool doHeapRegion(HeapRegion* r) {
ysr@777 2536 if (!r->used_region().is_empty() && !r->evacuation_failed()) {
ysr@777 2537 MemRegion usedMR = r->used_region();
ysr@777 2538 _bm->clearRange(r->used_region());
ysr@777 2539 }
ysr@777 2540 return false;
ysr@777 2541 }
ysr@777 2542 };
ysr@777 2543
ysr@777 2544 void ConcurrentMark::complete_marking_in_collection_set() {
ysr@777 2545 G1CollectedHeap* g1h = G1CollectedHeap::heap();
ysr@777 2546
ysr@777 2547 if (!g1h->mark_in_progress()) {
ysr@777 2548 g1h->g1_policy()->record_mark_closure_time(0.0);
ysr@777 2549 return;
ysr@777 2550 }
ysr@777 2551
ysr@777 2552 int i = 1;
ysr@777 2553 double start = os::elapsedTime();
ysr@777 2554 while (true) {
ysr@777 2555 i++;
ysr@777 2556 CompleteMarkingInCSHRClosure cmplt(this);
ysr@777 2557 g1h->collection_set_iterate(&cmplt);
ysr@777 2558 if (cmplt.completed()) break;
ysr@777 2559 }
ysr@777 2560 double end_time = os::elapsedTime();
ysr@777 2561 double elapsed_time_ms = (end_time - start) * 1000.0;
ysr@777 2562 g1h->g1_policy()->record_mark_closure_time(elapsed_time_ms);
ysr@777 2563 if (PrintGCDetails) {
ysr@777 2564 gclog_or_tty->print_cr("Mark closure took %5.2f ms.", elapsed_time_ms);
ysr@777 2565 }
ysr@777 2566
ysr@777 2567 ClearMarksInHRClosure clr(nextMarkBitMap());
ysr@777 2568 g1h->collection_set_iterate(&clr);
ysr@777 2569 }
ysr@777 2570
ysr@777 2571 // The next two methods deal with the following optimisation. Some
ysr@777 2572 // objects are gray by being marked and located above the finger. If
ysr@777 2573 // they are copied, during an evacuation pause, below the finger then
ysr@777 2574 // the need to be pushed on the stack. The observation is that, if
ysr@777 2575 // there are no regions in the collection set located above the
ysr@777 2576 // finger, then the above cannot happen, hence we do not need to
ysr@777 2577 // explicitly gray any objects when copying them to below the
ysr@777 2578 // finger. The global stack will be scanned to ensure that, if it
ysr@777 2579 // points to objects being copied, it will update their
ysr@777 2580 // location. There is a tricky situation with the gray objects in
ysr@777 2581 // region stack that are being coped, however. See the comment in
ysr@777 2582 // newCSet().
ysr@777 2583
ysr@777 2584 void ConcurrentMark::newCSet() {
ysr@777 2585 if (!concurrent_marking_in_progress())
ysr@777 2586 // nothing to do if marking is not in progress
ysr@777 2587 return;
ysr@777 2588
ysr@777 2589 // find what the lowest finger is among the global and local fingers
ysr@777 2590 _min_finger = _finger;
ysr@777 2591 for (int i = 0; i < (int)_max_task_num; ++i) {
ysr@777 2592 CMTask* task = _tasks[i];
ysr@777 2593 HeapWord* task_finger = task->finger();
ysr@777 2594 if (task_finger != NULL && task_finger < _min_finger)
ysr@777 2595 _min_finger = task_finger;
ysr@777 2596 }
ysr@777 2597
ysr@777 2598 _should_gray_objects = false;
ysr@777 2599
ysr@777 2600 // This fixes a very subtle and fustrating bug. It might be the case
ysr@777 2601 // that, during en evacuation pause, heap regions that contain
ysr@777 2602 // objects that are gray (by being in regions contained in the
ysr@777 2603 // region stack) are included in the collection set. Since such gray
ysr@777 2604 // objects will be moved, and because it's not easy to redirect
ysr@777 2605 // region stack entries to point to a new location (because objects
ysr@777 2606 // in one region might be scattered to multiple regions after they
ysr@777 2607 // are copied), one option is to ensure that all marked objects
ysr@777 2608 // copied during a pause are pushed on the stack. Notice, however,
ysr@777 2609 // that this problem can only happen when the region stack is not
ysr@777 2610 // empty during an evacuation pause. So, we make the fix a bit less
ysr@777 2611 // conservative and ensure that regions are pushed on the stack,
ysr@777 2612 // irrespective whether all collection set regions are below the
ysr@777 2613 // finger, if the region stack is not empty. This is expected to be
ysr@777 2614 // a rare case, so I don't think it's necessary to be smarted about it.
ysr@777 2615 if (!region_stack_empty())
ysr@777 2616 _should_gray_objects = true;
ysr@777 2617 }
ysr@777 2618
ysr@777 2619 void ConcurrentMark::registerCSetRegion(HeapRegion* hr) {
ysr@777 2620 if (!concurrent_marking_in_progress())
ysr@777 2621 return;
ysr@777 2622
ysr@777 2623 HeapWord* region_end = hr->end();
ysr@777 2624 if (region_end > _min_finger)
ysr@777 2625 _should_gray_objects = true;
ysr@777 2626 }
ysr@777 2627
ysr@777 2628 void ConcurrentMark::disable_co_trackers() {
ysr@777 2629 if (has_aborted()) {
ysr@777 2630 if (_cleanup_co_tracker.enabled())
ysr@777 2631 _cleanup_co_tracker.disable();
ysr@777 2632 for (int i = 0; i < (int)_max_task_num; ++i) {
ysr@777 2633 CMTask* task = _tasks[i];
ysr@777 2634 if (task->co_tracker_enabled())
ysr@777 2635 task->disable_co_tracker();
ysr@777 2636 }
ysr@777 2637 } else {
ysr@777 2638 guarantee( !_cleanup_co_tracker.enabled(), "invariant" );
ysr@777 2639 for (int i = 0; i < (int)_max_task_num; ++i) {
ysr@777 2640 CMTask* task = _tasks[i];
ysr@777 2641 guarantee( !task->co_tracker_enabled(), "invariant" );
ysr@777 2642 }
ysr@777 2643 }
ysr@777 2644 }
ysr@777 2645
ysr@777 2646 // abandon current marking iteration due to a Full GC
ysr@777 2647 void ConcurrentMark::abort() {
ysr@777 2648 // Clear all marks to force marking thread to do nothing
ysr@777 2649 _nextMarkBitMap->clearAll();
ysr@777 2650 // Empty mark stack
ysr@777 2651 clear_marking_state();
ysr@777 2652 for (int i = 0; i < (int)_max_task_num; ++i)
ysr@777 2653 _tasks[i]->clear_region_fields();
ysr@777 2654 _has_aborted = true;
ysr@777 2655
ysr@777 2656 SATBMarkQueueSet& satb_mq_set = JavaThread::satb_mark_queue_set();
ysr@777 2657 satb_mq_set.abandon_partial_marking();
ysr@777 2658 satb_mq_set.set_active_all_threads(false);
ysr@777 2659 }
ysr@777 2660
ysr@777 2661 static void print_ms_time_info(const char* prefix, const char* name,
ysr@777 2662 NumberSeq& ns) {
ysr@777 2663 gclog_or_tty->print_cr("%s%5d %12s: total time = %8.2f s (avg = %8.2f ms).",
ysr@777 2664 prefix, ns.num(), name, ns.sum()/1000.0, ns.avg());
ysr@777 2665 if (ns.num() > 0) {
ysr@777 2666 gclog_or_tty->print_cr("%s [std. dev = %8.2f ms, max = %8.2f ms]",
ysr@777 2667 prefix, ns.sd(), ns.maximum());
ysr@777 2668 }
ysr@777 2669 }
ysr@777 2670
ysr@777 2671 void ConcurrentMark::print_summary_info() {
ysr@777 2672 gclog_or_tty->print_cr(" Concurrent marking:");
ysr@777 2673 print_ms_time_info(" ", "init marks", _init_times);
ysr@777 2674 print_ms_time_info(" ", "remarks", _remark_times);
ysr@777 2675 {
ysr@777 2676 print_ms_time_info(" ", "final marks", _remark_mark_times);
ysr@777 2677 print_ms_time_info(" ", "weak refs", _remark_weak_ref_times);
ysr@777 2678
ysr@777 2679 }
ysr@777 2680 print_ms_time_info(" ", "cleanups", _cleanup_times);
ysr@777 2681 gclog_or_tty->print_cr(" Final counting total time = %8.2f s (avg = %8.2f ms).",
ysr@777 2682 _total_counting_time,
ysr@777 2683 (_cleanup_times.num() > 0 ? _total_counting_time * 1000.0 /
ysr@777 2684 (double)_cleanup_times.num()
ysr@777 2685 : 0.0));
ysr@777 2686 if (G1ScrubRemSets) {
ysr@777 2687 gclog_or_tty->print_cr(" RS scrub total time = %8.2f s (avg = %8.2f ms).",
ysr@777 2688 _total_rs_scrub_time,
ysr@777 2689 (_cleanup_times.num() > 0 ? _total_rs_scrub_time * 1000.0 /
ysr@777 2690 (double)_cleanup_times.num()
ysr@777 2691 : 0.0));
ysr@777 2692 }
ysr@777 2693 gclog_or_tty->print_cr(" Total stop_world time = %8.2f s.",
ysr@777 2694 (_init_times.sum() + _remark_times.sum() +
ysr@777 2695 _cleanup_times.sum())/1000.0);
ysr@777 2696 gclog_or_tty->print_cr(" Total concurrent time = %8.2f s "
ysr@777 2697 "(%8.2f s marking, %8.2f s counting).",
ysr@777 2698 cmThread()->vtime_accum(),
ysr@777 2699 cmThread()->vtime_mark_accum(),
ysr@777 2700 cmThread()->vtime_count_accum());
ysr@777 2701 }
ysr@777 2702
ysr@777 2703 // Closures
ysr@777 2704 // XXX: there seems to be a lot of code duplication here;
ysr@777 2705 // should refactor and consolidate the shared code.
ysr@777 2706
ysr@777 2707 // This closure is used to mark refs into the CMS generation in
ysr@777 2708 // the CMS bit map. Called at the first checkpoint.
ysr@777 2709
ysr@777 2710 // We take a break if someone is trying to stop the world.
ysr@777 2711 bool ConcurrentMark::do_yield_check(int worker_i) {
ysr@777 2712 if (should_yield()) {
ysr@777 2713 if (worker_i == 0)
ysr@777 2714 _g1h->g1_policy()->record_concurrent_pause();
ysr@777 2715 cmThread()->yield();
ysr@777 2716 if (worker_i == 0)
ysr@777 2717 _g1h->g1_policy()->record_concurrent_pause_end();
ysr@777 2718 return true;
ysr@777 2719 } else {
ysr@777 2720 return false;
ysr@777 2721 }
ysr@777 2722 }
ysr@777 2723
ysr@777 2724 bool ConcurrentMark::should_yield() {
ysr@777 2725 return cmThread()->should_yield();
ysr@777 2726 }
ysr@777 2727
ysr@777 2728 bool ConcurrentMark::containing_card_is_marked(void* p) {
ysr@777 2729 size_t offset = pointer_delta(p, _g1h->reserved_region().start(), 1);
ysr@777 2730 return _card_bm.at(offset >> CardTableModRefBS::card_shift);
ysr@777 2731 }
ysr@777 2732
ysr@777 2733 bool ConcurrentMark::containing_cards_are_marked(void* start,
ysr@777 2734 void* last) {
ysr@777 2735 return
ysr@777 2736 containing_card_is_marked(start) &&
ysr@777 2737 containing_card_is_marked(last);
ysr@777 2738 }
ysr@777 2739
ysr@777 2740 #ifndef PRODUCT
ysr@777 2741 // for debugging purposes
ysr@777 2742 void ConcurrentMark::print_finger() {
ysr@777 2743 gclog_or_tty->print_cr("heap ["PTR_FORMAT", "PTR_FORMAT"), global finger = "PTR_FORMAT,
ysr@777 2744 _heap_start, _heap_end, _finger);
ysr@777 2745 for (int i = 0; i < (int) _max_task_num; ++i) {
ysr@777 2746 gclog_or_tty->print(" %d: "PTR_FORMAT, i, _tasks[i]->finger());
ysr@777 2747 }
ysr@777 2748 gclog_or_tty->print_cr("");
ysr@777 2749 }
ysr@777 2750 #endif
ysr@777 2751
ysr@777 2752 // Closure for iteration over bitmaps
ysr@777 2753 class CMBitMapClosure : public BitMapClosure {
ysr@777 2754 private:
ysr@777 2755 // the bitmap that is being iterated over
ysr@777 2756 CMBitMap* _nextMarkBitMap;
ysr@777 2757 ConcurrentMark* _cm;
ysr@777 2758 CMTask* _task;
ysr@777 2759 // true if we're scanning a heap region claimed by the task (so that
ysr@777 2760 // we move the finger along), false if we're not, i.e. currently when
ysr@777 2761 // scanning a heap region popped from the region stack (so that we
ysr@777 2762 // do not move the task finger along; it'd be a mistake if we did so).
ysr@777 2763 bool _scanning_heap_region;
ysr@777 2764
ysr@777 2765 public:
ysr@777 2766 CMBitMapClosure(CMTask *task,
ysr@777 2767 ConcurrentMark* cm,
ysr@777 2768 CMBitMap* nextMarkBitMap)
ysr@777 2769 : _task(task), _cm(cm), _nextMarkBitMap(nextMarkBitMap) { }
ysr@777 2770
ysr@777 2771 void set_scanning_heap_region(bool scanning_heap_region) {
ysr@777 2772 _scanning_heap_region = scanning_heap_region;
ysr@777 2773 }
ysr@777 2774
ysr@777 2775 bool do_bit(size_t offset) {
ysr@777 2776 HeapWord* addr = _nextMarkBitMap->offsetToHeapWord(offset);
ysr@777 2777 tmp_guarantee_CM( _nextMarkBitMap->isMarked(addr), "invariant" );
ysr@777 2778 tmp_guarantee_CM( addr < _cm->finger(), "invariant" );
ysr@777 2779
ysr@777 2780 if (_scanning_heap_region) {
ysr@777 2781 statsOnly( _task->increase_objs_found_on_bitmap() );
ysr@777 2782 tmp_guarantee_CM( addr >= _task->finger(), "invariant" );
ysr@777 2783 // We move that task's local finger along.
ysr@777 2784 _task->move_finger_to(addr);
ysr@777 2785 } else {
ysr@777 2786 // We move the task's region finger along.
ysr@777 2787 _task->move_region_finger_to(addr);
ysr@777 2788 }
ysr@777 2789
ysr@777 2790 _task->scan_object(oop(addr));
ysr@777 2791 // we only partially drain the local queue and global stack
ysr@777 2792 _task->drain_local_queue(true);
ysr@777 2793 _task->drain_global_stack(true);
ysr@777 2794
ysr@777 2795 // if the has_aborted flag has been raised, we need to bail out of
ysr@777 2796 // the iteration
ysr@777 2797 return !_task->has_aborted();
ysr@777 2798 }
ysr@777 2799 };
ysr@777 2800
ysr@777 2801 // Closure for iterating over objects, currently only used for
ysr@777 2802 // processing SATB buffers.
ysr@777 2803 class CMObjectClosure : public ObjectClosure {
ysr@777 2804 private:
ysr@777 2805 CMTask* _task;
ysr@777 2806
ysr@777 2807 public:
ysr@777 2808 void do_object(oop obj) {
ysr@777 2809 _task->deal_with_reference(obj);
ysr@777 2810 }
ysr@777 2811
ysr@777 2812 CMObjectClosure(CMTask* task) : _task(task) { }
ysr@777 2813 };
ysr@777 2814
ysr@777 2815 // Closure for iterating over object fields
ysr@777 2816 class CMOopClosure : public OopClosure {
ysr@777 2817 private:
ysr@777 2818 G1CollectedHeap* _g1h;
ysr@777 2819 ConcurrentMark* _cm;
ysr@777 2820 CMTask* _task;
ysr@777 2821
ysr@777 2822 public:
ysr@1280 2823 virtual void do_oop(narrowOop* p) { do_oop_work(p); }
ysr@1280 2824 virtual void do_oop( oop* p) { do_oop_work(p); }
ysr@1280 2825
ysr@1280 2826 template <class T> void do_oop_work(T* p) {
ysr@777 2827 tmp_guarantee_CM( _g1h->is_in_g1_reserved((HeapWord*) p), "invariant" );
ysr@1280 2828 tmp_guarantee_CM( !_g1h->heap_region_containing((HeapWord*) p)->is_on_free_list(), "invariant" );
ysr@1280 2829
ysr@1280 2830 oop obj = oopDesc::load_decode_heap_oop(p);
ysr@777 2831 if (_cm->verbose_high())
ysr@777 2832 gclog_or_tty->print_cr("[%d] we're looking at location "
ysr@777 2833 "*"PTR_FORMAT" = "PTR_FORMAT,
ysr@777 2834 _task->task_id(), p, (void*) obj);
ysr@777 2835 _task->deal_with_reference(obj);
ysr@777 2836 }
ysr@777 2837
ysr@777 2838 CMOopClosure(G1CollectedHeap* g1h,
ysr@777 2839 ConcurrentMark* cm,
ysr@777 2840 CMTask* task)
ysr@777 2841 : _g1h(g1h), _cm(cm), _task(task) { }
ysr@777 2842 };
ysr@777 2843
ysr@777 2844 void CMTask::setup_for_region(HeapRegion* hr) {
ysr@777 2845 tmp_guarantee_CM( hr != NULL && !hr->continuesHumongous(),
ysr@777 2846 "claim_region() should have filtered out continues humongous regions" );
ysr@777 2847
ysr@777 2848 if (_cm->verbose_low())
ysr@777 2849 gclog_or_tty->print_cr("[%d] setting up for region "PTR_FORMAT,
ysr@777 2850 _task_id, hr);
ysr@777 2851
ysr@777 2852 _curr_region = hr;
ysr@777 2853 _finger = hr->bottom();
ysr@777 2854 update_region_limit();
ysr@777 2855 }
ysr@777 2856
ysr@777 2857 void CMTask::update_region_limit() {
ysr@777 2858 HeapRegion* hr = _curr_region;
ysr@777 2859 HeapWord* bottom = hr->bottom();
ysr@777 2860 HeapWord* limit = hr->next_top_at_mark_start();
ysr@777 2861
ysr@777 2862 if (limit == bottom) {
ysr@777 2863 if (_cm->verbose_low())
ysr@777 2864 gclog_or_tty->print_cr("[%d] found an empty region "
ysr@777 2865 "["PTR_FORMAT", "PTR_FORMAT")",
ysr@777 2866 _task_id, bottom, limit);
ysr@777 2867 // The region was collected underneath our feet.
ysr@777 2868 // We set the finger to bottom to ensure that the bitmap
ysr@777 2869 // iteration that will follow this will not do anything.
ysr@777 2870 // (this is not a condition that holds when we set the region up,
ysr@777 2871 // as the region is not supposed to be empty in the first place)
ysr@777 2872 _finger = bottom;
ysr@777 2873 } else if (limit >= _region_limit) {
ysr@777 2874 tmp_guarantee_CM( limit >= _finger, "peace of mind" );
ysr@777 2875 } else {
ysr@777 2876 tmp_guarantee_CM( limit < _region_limit, "only way to get here" );
ysr@777 2877 // This can happen under some pretty unusual circumstances. An
ysr@777 2878 // evacuation pause empties the region underneath our feet (NTAMS
ysr@777 2879 // at bottom). We then do some allocation in the region (NTAMS
ysr@777 2880 // stays at bottom), followed by the region being used as a GC
ysr@777 2881 // alloc region (NTAMS will move to top() and the objects
ysr@777 2882 // originally below it will be grayed). All objects now marked in
ysr@777 2883 // the region are explicitly grayed, if below the global finger,
ysr@777 2884 // and we do not need in fact to scan anything else. So, we simply
ysr@777 2885 // set _finger to be limit to ensure that the bitmap iteration
ysr@777 2886 // doesn't do anything.
ysr@777 2887 _finger = limit;
ysr@777 2888 }
ysr@777 2889
ysr@777 2890 _region_limit = limit;
ysr@777 2891 }
ysr@777 2892
ysr@777 2893 void CMTask::giveup_current_region() {
ysr@777 2894 tmp_guarantee_CM( _curr_region != NULL, "invariant" );
ysr@777 2895 if (_cm->verbose_low())
ysr@777 2896 gclog_or_tty->print_cr("[%d] giving up region "PTR_FORMAT,
ysr@777 2897 _task_id, _curr_region);
ysr@777 2898 clear_region_fields();
ysr@777 2899 }
ysr@777 2900
ysr@777 2901 void CMTask::clear_region_fields() {
ysr@777 2902 // Values for these three fields that indicate that we're not
ysr@777 2903 // holding on to a region.
ysr@777 2904 _curr_region = NULL;
ysr@777 2905 _finger = NULL;
ysr@777 2906 _region_limit = NULL;
ysr@777 2907
ysr@777 2908 _region_finger = NULL;
ysr@777 2909 }
ysr@777 2910
ysr@777 2911 void CMTask::reset(CMBitMap* nextMarkBitMap) {
ysr@777 2912 guarantee( nextMarkBitMap != NULL, "invariant" );
ysr@777 2913
ysr@777 2914 if (_cm->verbose_low())
ysr@777 2915 gclog_or_tty->print_cr("[%d] resetting", _task_id);
ysr@777 2916
ysr@777 2917 _nextMarkBitMap = nextMarkBitMap;
ysr@777 2918 clear_region_fields();
ysr@777 2919
ysr@777 2920 _calls = 0;
ysr@777 2921 _elapsed_time_ms = 0.0;
ysr@777 2922 _termination_time_ms = 0.0;
ysr@777 2923 _termination_start_time_ms = 0.0;
ysr@777 2924
ysr@777 2925 #if _MARKING_STATS_
ysr@777 2926 _local_pushes = 0;
ysr@777 2927 _local_pops = 0;
ysr@777 2928 _local_max_size = 0;
ysr@777 2929 _objs_scanned = 0;
ysr@777 2930 _global_pushes = 0;
ysr@777 2931 _global_pops = 0;
ysr@777 2932 _global_max_size = 0;
ysr@777 2933 _global_transfers_to = 0;
ysr@777 2934 _global_transfers_from = 0;
ysr@777 2935 _region_stack_pops = 0;
ysr@777 2936 _regions_claimed = 0;
ysr@777 2937 _objs_found_on_bitmap = 0;
ysr@777 2938 _satb_buffers_processed = 0;
ysr@777 2939 _steal_attempts = 0;
ysr@777 2940 _steals = 0;
ysr@777 2941 _aborted = 0;
ysr@777 2942 _aborted_overflow = 0;
ysr@777 2943 _aborted_cm_aborted = 0;
ysr@777 2944 _aborted_yield = 0;
ysr@777 2945 _aborted_timed_out = 0;
ysr@777 2946 _aborted_satb = 0;
ysr@777 2947 _aborted_termination = 0;
ysr@777 2948 #endif // _MARKING_STATS_
ysr@777 2949 }
ysr@777 2950
ysr@777 2951 bool CMTask::should_exit_termination() {
ysr@777 2952 regular_clock_call();
ysr@777 2953 // This is called when we are in the termination protocol. We should
ysr@777 2954 // quit if, for some reason, this task wants to abort or the global
ysr@777 2955 // stack is not empty (this means that we can get work from it).
ysr@777 2956 return !_cm->mark_stack_empty() || has_aborted();
ysr@777 2957 }
ysr@777 2958
ysr@777 2959 // This determines whether the method below will check both the local
ysr@777 2960 // and global fingers when determining whether to push on the stack a
ysr@777 2961 // gray object (value 1) or whether it will only check the global one
ysr@777 2962 // (value 0). The tradeoffs are that the former will be a bit more
ysr@777 2963 // accurate and possibly push less on the stack, but it might also be
ysr@777 2964 // a little bit slower.
ysr@777 2965
ysr@777 2966 #define _CHECK_BOTH_FINGERS_ 1
ysr@777 2967
ysr@777 2968 void CMTask::deal_with_reference(oop obj) {
ysr@777 2969 if (_cm->verbose_high())
ysr@777 2970 gclog_or_tty->print_cr("[%d] we're dealing with reference = "PTR_FORMAT,
ysr@777 2971 _task_id, (void*) obj);
ysr@777 2972
ysr@777 2973 ++_refs_reached;
ysr@777 2974
ysr@777 2975 HeapWord* objAddr = (HeapWord*) obj;
ysr@1280 2976 assert(obj->is_oop_or_null(true /* ignore mark word */), "Error");
ysr@777 2977 if (_g1h->is_in_g1_reserved(objAddr)) {
ysr@777 2978 tmp_guarantee_CM( obj != NULL, "is_in_g1_reserved should ensure this" );
ysr@777 2979 HeapRegion* hr = _g1h->heap_region_containing(obj);
ysr@777 2980 if (_g1h->is_obj_ill(obj, hr)) {
ysr@777 2981 if (_cm->verbose_high())
ysr@777 2982 gclog_or_tty->print_cr("[%d] "PTR_FORMAT" is not considered marked",
ysr@777 2983 _task_id, (void*) obj);
ysr@777 2984
ysr@777 2985 // we need to mark it first
ysr@777 2986 if (_nextMarkBitMap->parMark(objAddr)) {
ysr@777 2987 // No OrderAccess:store_load() is needed. It is implicit in the
ysr@777 2988 // CAS done in parMark(objAddr) above
ysr@777 2989 HeapWord* global_finger = _cm->finger();
ysr@777 2990
ysr@777 2991 #if _CHECK_BOTH_FINGERS_
ysr@777 2992 // we will check both the local and global fingers
ysr@777 2993
ysr@777 2994 if (_finger != NULL && objAddr < _finger) {
ysr@777 2995 if (_cm->verbose_high())
ysr@777 2996 gclog_or_tty->print_cr("[%d] below the local finger ("PTR_FORMAT"), "
ysr@777 2997 "pushing it", _task_id, _finger);
ysr@777 2998 push(obj);
ysr@777 2999 } else if (_curr_region != NULL && objAddr < _region_limit) {
ysr@777 3000 // do nothing
ysr@777 3001 } else if (objAddr < global_finger) {
ysr@777 3002 // Notice that the global finger might be moving forward
ysr@777 3003 // concurrently. This is not a problem. In the worst case, we
ysr@777 3004 // mark the object while it is above the global finger and, by
ysr@777 3005 // the time we read the global finger, it has moved forward
ysr@777 3006 // passed this object. In this case, the object will probably
ysr@777 3007 // be visited when a task is scanning the region and will also
ysr@777 3008 // be pushed on the stack. So, some duplicate work, but no
ysr@777 3009 // correctness problems.
ysr@777 3010
ysr@777 3011 if (_cm->verbose_high())
ysr@777 3012 gclog_or_tty->print_cr("[%d] below the global finger "
ysr@777 3013 "("PTR_FORMAT"), pushing it",
ysr@777 3014 _task_id, global_finger);
ysr@777 3015 push(obj);
ysr@777 3016 } else {
ysr@777 3017 // do nothing
ysr@777 3018 }
ysr@777 3019 #else // _CHECK_BOTH_FINGERS_
ysr@777 3020 // we will only check the global finger
ysr@777 3021
ysr@777 3022 if (objAddr < global_finger) {
ysr@777 3023 // see long comment above
ysr@777 3024
ysr@777 3025 if (_cm->verbose_high())
ysr@777 3026 gclog_or_tty->print_cr("[%d] below the global finger "
ysr@777 3027 "("PTR_FORMAT"), pushing it",
ysr@777 3028 _task_id, global_finger);
ysr@777 3029 push(obj);
ysr@777 3030 }
ysr@777 3031 #endif // _CHECK_BOTH_FINGERS_
ysr@777 3032 }
ysr@777 3033 }
ysr@777 3034 }
ysr@777 3035 }
ysr@777 3036
ysr@777 3037 void CMTask::push(oop obj) {
ysr@777 3038 HeapWord* objAddr = (HeapWord*) obj;
ysr@777 3039 tmp_guarantee_CM( _g1h->is_in_g1_reserved(objAddr), "invariant" );
ysr@1280 3040 tmp_guarantee_CM( !_g1h->heap_region_containing(objAddr)->is_on_free_list(), "invariant" );
ysr@777 3041 tmp_guarantee_CM( !_g1h->is_obj_ill(obj), "invariant" );
ysr@777 3042 tmp_guarantee_CM( _nextMarkBitMap->isMarked(objAddr), "invariant" );
ysr@777 3043
ysr@777 3044 if (_cm->verbose_high())
ysr@777 3045 gclog_or_tty->print_cr("[%d] pushing "PTR_FORMAT, _task_id, (void*) obj);
ysr@777 3046
ysr@777 3047 if (!_task_queue->push(obj)) {
ysr@777 3048 // The local task queue looks full. We need to push some entries
ysr@777 3049 // to the global stack.
ysr@777 3050
ysr@777 3051 if (_cm->verbose_medium())
ysr@777 3052 gclog_or_tty->print_cr("[%d] task queue overflow, "
ysr@777 3053 "moving entries to the global stack",
ysr@777 3054 _task_id);
ysr@777 3055 move_entries_to_global_stack();
ysr@777 3056
ysr@777 3057 // this should succeed since, even if we overflow the global
ysr@777 3058 // stack, we should have definitely removed some entries from the
ysr@777 3059 // local queue. So, there must be space on it.
ysr@777 3060 bool success = _task_queue->push(obj);
ysr@777 3061 tmp_guarantee_CM( success, "invariant" );
ysr@777 3062 }
ysr@777 3063
ysr@777 3064 statsOnly( int tmp_size = _task_queue->size();
ysr@777 3065 if (tmp_size > _local_max_size)
ysr@777 3066 _local_max_size = tmp_size;
ysr@777 3067 ++_local_pushes );
ysr@777 3068 }
ysr@777 3069
ysr@777 3070 void CMTask::reached_limit() {
ysr@777 3071 tmp_guarantee_CM( _words_scanned >= _words_scanned_limit ||
ysr@777 3072 _refs_reached >= _refs_reached_limit ,
ysr@777 3073 "shouldn't have been called otherwise" );
ysr@777 3074 regular_clock_call();
ysr@777 3075 }
ysr@777 3076
ysr@777 3077 void CMTask::regular_clock_call() {
ysr@777 3078 if (has_aborted())
ysr@777 3079 return;
ysr@777 3080
ysr@777 3081 // First, we need to recalculate the words scanned and refs reached
ysr@777 3082 // limits for the next clock call.
ysr@777 3083 recalculate_limits();
ysr@777 3084
ysr@777 3085 // During the regular clock call we do the following
ysr@777 3086
ysr@777 3087 // (1) If an overflow has been flagged, then we abort.
ysr@777 3088 if (_cm->has_overflown()) {
ysr@777 3089 set_has_aborted();
ysr@777 3090 return;
ysr@777 3091 }
ysr@777 3092
ysr@777 3093 // If we are not concurrent (i.e. we're doing remark) we don't need
ysr@777 3094 // to check anything else. The other steps are only needed during
ysr@777 3095 // the concurrent marking phase.
ysr@777 3096 if (!concurrent())
ysr@777 3097 return;
ysr@777 3098
ysr@777 3099 // (2) If marking has been aborted for Full GC, then we also abort.
ysr@777 3100 if (_cm->has_aborted()) {
ysr@777 3101 set_has_aborted();
ysr@777 3102 statsOnly( ++_aborted_cm_aborted );
ysr@777 3103 return;
ysr@777 3104 }
ysr@777 3105
ysr@777 3106 double curr_time_ms = os::elapsedVTime() * 1000.0;
ysr@777 3107
ysr@777 3108 // (3) If marking stats are enabled, then we update the step history.
ysr@777 3109 #if _MARKING_STATS_
ysr@777 3110 if (_words_scanned >= _words_scanned_limit)
ysr@777 3111 ++_clock_due_to_scanning;
ysr@777 3112 if (_refs_reached >= _refs_reached_limit)
ysr@777 3113 ++_clock_due_to_marking;
ysr@777 3114
ysr@777 3115 double last_interval_ms = curr_time_ms - _interval_start_time_ms;
ysr@777 3116 _interval_start_time_ms = curr_time_ms;
ysr@777 3117 _all_clock_intervals_ms.add(last_interval_ms);
ysr@777 3118
ysr@777 3119 if (_cm->verbose_medium()) {
ysr@777 3120 gclog_or_tty->print_cr("[%d] regular clock, interval = %1.2lfms, "
ysr@777 3121 "scanned = %d%s, refs reached = %d%s",
ysr@777 3122 _task_id, last_interval_ms,
ysr@777 3123 _words_scanned,
ysr@777 3124 (_words_scanned >= _words_scanned_limit) ? " (*)" : "",
ysr@777 3125 _refs_reached,
ysr@777 3126 (_refs_reached >= _refs_reached_limit) ? " (*)" : "");
ysr@777 3127 }
ysr@777 3128 #endif // _MARKING_STATS_
ysr@777 3129
ysr@777 3130 // (4) We check whether we should yield. If we have to, then we abort.
ysr@777 3131 if (_cm->should_yield()) {
ysr@777 3132 // We should yield. To do this we abort the task. The caller is
ysr@777 3133 // responsible for yielding.
ysr@777 3134 set_has_aborted();
ysr@777 3135 statsOnly( ++_aborted_yield );
ysr@777 3136 return;
ysr@777 3137 }
ysr@777 3138
ysr@777 3139 // (5) We check whether we've reached our time quota. If we have,
ysr@777 3140 // then we abort.
ysr@777 3141 double elapsed_time_ms = curr_time_ms - _start_time_ms;
ysr@777 3142 if (elapsed_time_ms > _time_target_ms) {
ysr@777 3143 set_has_aborted();
ysr@777 3144 _has_aborted_timed_out = true;
ysr@777 3145 statsOnly( ++_aborted_timed_out );
ysr@777 3146 return;
ysr@777 3147 }
ysr@777 3148
ysr@777 3149 // (6) Finally, we check whether there are enough completed STAB
ysr@777 3150 // buffers available for processing. If there are, we abort.
ysr@777 3151 SATBMarkQueueSet& satb_mq_set = JavaThread::satb_mark_queue_set();
ysr@777 3152 if (!_draining_satb_buffers && satb_mq_set.process_completed_buffers()) {
ysr@777 3153 if (_cm->verbose_low())
ysr@777 3154 gclog_or_tty->print_cr("[%d] aborting to deal with pending SATB buffers",
ysr@777 3155 _task_id);
ysr@777 3156 // we do need to process SATB buffers, we'll abort and restart
ysr@777 3157 // the marking task to do so
ysr@777 3158 set_has_aborted();
ysr@777 3159 statsOnly( ++_aborted_satb );
ysr@777 3160 return;
ysr@777 3161 }
ysr@777 3162 }
ysr@777 3163
ysr@777 3164 void CMTask::recalculate_limits() {
ysr@777 3165 _real_words_scanned_limit = _words_scanned + words_scanned_period;
ysr@777 3166 _words_scanned_limit = _real_words_scanned_limit;
ysr@777 3167
ysr@777 3168 _real_refs_reached_limit = _refs_reached + refs_reached_period;
ysr@777 3169 _refs_reached_limit = _real_refs_reached_limit;
ysr@777 3170 }
ysr@777 3171
ysr@777 3172 void CMTask::decrease_limits() {
ysr@777 3173 // This is called when we believe that we're going to do an infrequent
ysr@777 3174 // operation which will increase the per byte scanned cost (i.e. move
ysr@777 3175 // entries to/from the global stack). It basically tries to decrease the
ysr@777 3176 // scanning limit so that the clock is called earlier.
ysr@777 3177
ysr@777 3178 if (_cm->verbose_medium())
ysr@777 3179 gclog_or_tty->print_cr("[%d] decreasing limits", _task_id);
ysr@777 3180
ysr@777 3181 _words_scanned_limit = _real_words_scanned_limit -
ysr@777 3182 3 * words_scanned_period / 4;
ysr@777 3183 _refs_reached_limit = _real_refs_reached_limit -
ysr@777 3184 3 * refs_reached_period / 4;
ysr@777 3185 }
ysr@777 3186
ysr@777 3187 void CMTask::move_entries_to_global_stack() {
ysr@777 3188 // local array where we'll store the entries that will be popped
ysr@777 3189 // from the local queue
ysr@777 3190 oop buffer[global_stack_transfer_size];
ysr@777 3191
ysr@777 3192 int n = 0;
ysr@777 3193 oop obj;
ysr@777 3194 while (n < global_stack_transfer_size && _task_queue->pop_local(obj)) {
ysr@777 3195 buffer[n] = obj;
ysr@777 3196 ++n;
ysr@777 3197 }
ysr@777 3198
ysr@777 3199 if (n > 0) {
ysr@777 3200 // we popped at least one entry from the local queue
ysr@777 3201
ysr@777 3202 statsOnly( ++_global_transfers_to; _local_pops += n );
ysr@777 3203
ysr@777 3204 if (!_cm->mark_stack_push(buffer, n)) {
ysr@777 3205 if (_cm->verbose_low())
ysr@777 3206 gclog_or_tty->print_cr("[%d] aborting due to global stack overflow", _task_id);
ysr@777 3207 set_has_aborted();
ysr@777 3208 } else {
ysr@777 3209 // the transfer was successful
ysr@777 3210
ysr@777 3211 if (_cm->verbose_medium())
ysr@777 3212 gclog_or_tty->print_cr("[%d] pushed %d entries to the global stack",
ysr@777 3213 _task_id, n);
ysr@777 3214 statsOnly( int tmp_size = _cm->mark_stack_size();
ysr@777 3215 if (tmp_size > _global_max_size)
ysr@777 3216 _global_max_size = tmp_size;
ysr@777 3217 _global_pushes += n );
ysr@777 3218 }
ysr@777 3219 }
ysr@777 3220
ysr@777 3221 // this operation was quite expensive, so decrease the limits
ysr@777 3222 decrease_limits();
ysr@777 3223 }
ysr@777 3224
ysr@777 3225 void CMTask::get_entries_from_global_stack() {
ysr@777 3226 // local array where we'll store the entries that will be popped
ysr@777 3227 // from the global stack.
ysr@777 3228 oop buffer[global_stack_transfer_size];
ysr@777 3229 int n;
ysr@777 3230 _cm->mark_stack_pop(buffer, global_stack_transfer_size, &n);
ysr@777 3231 tmp_guarantee_CM( n <= global_stack_transfer_size,
ysr@777 3232 "we should not pop more than the given limit" );
ysr@777 3233 if (n > 0) {
ysr@777 3234 // yes, we did actually pop at least one entry
ysr@777 3235
ysr@777 3236 statsOnly( ++_global_transfers_from; _global_pops += n );
ysr@777 3237 if (_cm->verbose_medium())
ysr@777 3238 gclog_or_tty->print_cr("[%d] popped %d entries from the global stack",
ysr@777 3239 _task_id, n);
ysr@777 3240 for (int i = 0; i < n; ++i) {
ysr@777 3241 bool success = _task_queue->push(buffer[i]);
ysr@777 3242 // We only call this when the local queue is empty or under a
ysr@777 3243 // given target limit. So, we do not expect this push to fail.
ysr@777 3244 tmp_guarantee_CM( success, "invariant" );
ysr@777 3245 }
ysr@777 3246
ysr@777 3247 statsOnly( int tmp_size = _task_queue->size();
ysr@777 3248 if (tmp_size > _local_max_size)
ysr@777 3249 _local_max_size = tmp_size;
ysr@777 3250 _local_pushes += n );
ysr@777 3251 }
ysr@777 3252
ysr@777 3253 // this operation was quite expensive, so decrease the limits
ysr@777 3254 decrease_limits();
ysr@777 3255 }
ysr@777 3256
ysr@777 3257 void CMTask::drain_local_queue(bool partially) {
ysr@777 3258 if (has_aborted())
ysr@777 3259 return;
ysr@777 3260
ysr@777 3261 // Decide what the target size is, depending whether we're going to
ysr@777 3262 // drain it partially (so that other tasks can steal if they run out
ysr@777 3263 // of things to do) or totally (at the very end).
ysr@777 3264 size_t target_size;
ysr@777 3265 if (partially)
ysr@777 3266 target_size = MIN2((size_t)_task_queue->max_elems()/3, GCDrainStackTargetSize);
ysr@777 3267 else
ysr@777 3268 target_size = 0;
ysr@777 3269
ysr@777 3270 if (_task_queue->size() > target_size) {
ysr@777 3271 if (_cm->verbose_high())
ysr@777 3272 gclog_or_tty->print_cr("[%d] draining local queue, target size = %d",
ysr@777 3273 _task_id, target_size);
ysr@777 3274
ysr@777 3275 oop obj;
ysr@777 3276 bool ret = _task_queue->pop_local(obj);
ysr@777 3277 while (ret) {
ysr@777 3278 statsOnly( ++_local_pops );
ysr@777 3279
ysr@777 3280 if (_cm->verbose_high())
ysr@777 3281 gclog_or_tty->print_cr("[%d] popped "PTR_FORMAT, _task_id,
ysr@777 3282 (void*) obj);
ysr@777 3283
ysr@777 3284 tmp_guarantee_CM( _g1h->is_in_g1_reserved((HeapWord*) obj),
ysr@777 3285 "invariant" );
ysr@1280 3286 tmp_guarantee_CM( !_g1h->heap_region_containing(obj)->is_on_free_list(),
ysr@1280 3287 "invariant" );
ysr@777 3288
ysr@777 3289 scan_object(obj);
ysr@777 3290
ysr@777 3291 if (_task_queue->size() <= target_size || has_aborted())
ysr@777 3292 ret = false;
ysr@777 3293 else
ysr@777 3294 ret = _task_queue->pop_local(obj);
ysr@777 3295 }
ysr@777 3296
ysr@777 3297 if (_cm->verbose_high())
ysr@777 3298 gclog_or_tty->print_cr("[%d] drained local queue, size = %d",
ysr@777 3299 _task_id, _task_queue->size());
ysr@777 3300 }
ysr@777 3301 }
ysr@777 3302
ysr@777 3303 void CMTask::drain_global_stack(bool partially) {
ysr@777 3304 if (has_aborted())
ysr@777 3305 return;
ysr@777 3306
ysr@777 3307 // We have a policy to drain the local queue before we attempt to
ysr@777 3308 // drain the global stack.
ysr@777 3309 tmp_guarantee_CM( partially || _task_queue->size() == 0, "invariant" );
ysr@777 3310
ysr@777 3311 // Decide what the target size is, depending whether we're going to
ysr@777 3312 // drain it partially (so that other tasks can steal if they run out
ysr@777 3313 // of things to do) or totally (at the very end). Notice that,
ysr@777 3314 // because we move entries from the global stack in chunks or
ysr@777 3315 // because another task might be doing the same, we might in fact
ysr@777 3316 // drop below the target. But, this is not a problem.
ysr@777 3317 size_t target_size;
ysr@777 3318 if (partially)
ysr@777 3319 target_size = _cm->partial_mark_stack_size_target();
ysr@777 3320 else
ysr@777 3321 target_size = 0;
ysr@777 3322
ysr@777 3323 if (_cm->mark_stack_size() > target_size) {
ysr@777 3324 if (_cm->verbose_low())
ysr@777 3325 gclog_or_tty->print_cr("[%d] draining global_stack, target size %d",
ysr@777 3326 _task_id, target_size);
ysr@777 3327
ysr@777 3328 while (!has_aborted() && _cm->mark_stack_size() > target_size) {
ysr@777 3329 get_entries_from_global_stack();
ysr@777 3330 drain_local_queue(partially);
ysr@777 3331 }
ysr@777 3332
ysr@777 3333 if (_cm->verbose_low())
ysr@777 3334 gclog_or_tty->print_cr("[%d] drained global stack, size = %d",
ysr@777 3335 _task_id, _cm->mark_stack_size());
ysr@777 3336 }
ysr@777 3337 }
ysr@777 3338
ysr@777 3339 // SATB Queue has several assumptions on whether to call the par or
ysr@777 3340 // non-par versions of the methods. this is why some of the code is
ysr@777 3341 // replicated. We should really get rid of the single-threaded version
ysr@777 3342 // of the code to simplify things.
ysr@777 3343 void CMTask::drain_satb_buffers() {
ysr@777 3344 if (has_aborted())
ysr@777 3345 return;
ysr@777 3346
ysr@777 3347 // We set this so that the regular clock knows that we're in the
ysr@777 3348 // middle of draining buffers and doesn't set the abort flag when it
ysr@777 3349 // notices that SATB buffers are available for draining. It'd be
ysr@777 3350 // very counter productive if it did that. :-)
ysr@777 3351 _draining_satb_buffers = true;
ysr@777 3352
ysr@777 3353 CMObjectClosure oc(this);
ysr@777 3354 SATBMarkQueueSet& satb_mq_set = JavaThread::satb_mark_queue_set();
ysr@777 3355 if (ParallelGCThreads > 0)
ysr@777 3356 satb_mq_set.set_par_closure(_task_id, &oc);
ysr@777 3357 else
ysr@777 3358 satb_mq_set.set_closure(&oc);
ysr@777 3359
ysr@777 3360 // This keeps claiming and applying the closure to completed buffers
ysr@777 3361 // until we run out of buffers or we need to abort.
ysr@777 3362 if (ParallelGCThreads > 0) {
ysr@777 3363 while (!has_aborted() &&
ysr@777 3364 satb_mq_set.par_apply_closure_to_completed_buffer(_task_id)) {
ysr@777 3365 if (_cm->verbose_medium())
ysr@777 3366 gclog_or_tty->print_cr("[%d] processed an SATB buffer", _task_id);
ysr@777 3367 statsOnly( ++_satb_buffers_processed );
ysr@777 3368 regular_clock_call();
ysr@777 3369 }
ysr@777 3370 } else {
ysr@777 3371 while (!has_aborted() &&
ysr@777 3372 satb_mq_set.apply_closure_to_completed_buffer()) {
ysr@777 3373 if (_cm->verbose_medium())
ysr@777 3374 gclog_or_tty->print_cr("[%d] processed an SATB buffer", _task_id);
ysr@777 3375 statsOnly( ++_satb_buffers_processed );
ysr@777 3376 regular_clock_call();
ysr@777 3377 }
ysr@777 3378 }
ysr@777 3379
ysr@777 3380 if (!concurrent() && !has_aborted()) {
ysr@777 3381 // We should only do this during remark.
ysr@777 3382 if (ParallelGCThreads > 0)
ysr@777 3383 satb_mq_set.par_iterate_closure_all_threads(_task_id);
ysr@777 3384 else
ysr@777 3385 satb_mq_set.iterate_closure_all_threads();
ysr@777 3386 }
ysr@777 3387
ysr@777 3388 _draining_satb_buffers = false;
ysr@777 3389
ysr@777 3390 tmp_guarantee_CM( has_aborted() ||
ysr@777 3391 concurrent() ||
ysr@777 3392 satb_mq_set.completed_buffers_num() == 0, "invariant" );
ysr@777 3393
ysr@777 3394 if (ParallelGCThreads > 0)
ysr@777 3395 satb_mq_set.set_par_closure(_task_id, NULL);
ysr@777 3396 else
ysr@777 3397 satb_mq_set.set_closure(NULL);
ysr@777 3398
ysr@777 3399 // again, this was a potentially expensive operation, decrease the
ysr@777 3400 // limits to get the regular clock call early
ysr@777 3401 decrease_limits();
ysr@777 3402 }
ysr@777 3403
ysr@777 3404 void CMTask::drain_region_stack(BitMapClosure* bc) {
ysr@777 3405 if (has_aborted())
ysr@777 3406 return;
ysr@777 3407
ysr@777 3408 tmp_guarantee_CM( _region_finger == NULL,
ysr@777 3409 "it should be NULL when we're not scanning a region" );
ysr@777 3410
ysr@777 3411 if (!_cm->region_stack_empty()) {
ysr@777 3412 if (_cm->verbose_low())
ysr@777 3413 gclog_or_tty->print_cr("[%d] draining region stack, size = %d",
ysr@777 3414 _task_id, _cm->region_stack_size());
ysr@777 3415
ysr@777 3416 MemRegion mr = _cm->region_stack_pop();
ysr@777 3417 // it returns MemRegion() if the pop fails
ysr@777 3418 statsOnly(if (mr.start() != NULL) ++_region_stack_pops );
ysr@777 3419
ysr@777 3420 while (mr.start() != NULL) {
ysr@777 3421 if (_cm->verbose_medium())
ysr@777 3422 gclog_or_tty->print_cr("[%d] we are scanning region "
ysr@777 3423 "["PTR_FORMAT", "PTR_FORMAT")",
ysr@777 3424 _task_id, mr.start(), mr.end());
ysr@777 3425 tmp_guarantee_CM( mr.end() <= _cm->finger(),
ysr@777 3426 "otherwise the region shouldn't be on the stack" );
ysr@777 3427 assert(!mr.is_empty(), "Only non-empty regions live on the region stack");
ysr@777 3428 if (_nextMarkBitMap->iterate(bc, mr)) {
ysr@777 3429 tmp_guarantee_CM( !has_aborted(),
ysr@777 3430 "cannot abort the task without aborting the bitmap iteration" );
ysr@777 3431
ysr@777 3432 // We finished iterating over the region without aborting.
ysr@777 3433 regular_clock_call();
ysr@777 3434 if (has_aborted())
ysr@777 3435 mr = MemRegion();
ysr@777 3436 else {
ysr@777 3437 mr = _cm->region_stack_pop();
ysr@777 3438 // it returns MemRegion() if the pop fails
ysr@777 3439 statsOnly(if (mr.start() != NULL) ++_region_stack_pops );
ysr@777 3440 }
ysr@777 3441 } else {
ysr@777 3442 guarantee( has_aborted(), "currently the only way to do so" );
ysr@777 3443
ysr@777 3444 // The only way to abort the bitmap iteration is to return
ysr@777 3445 // false from the do_bit() method. However, inside the
ysr@777 3446 // do_bit() method we move the _region_finger to point to the
ysr@777 3447 // object currently being looked at. So, if we bail out, we
ysr@777 3448 // have definitely set _region_finger to something non-null.
ysr@777 3449 guarantee( _region_finger != NULL, "invariant" );
ysr@777 3450
ysr@777 3451 // The iteration was actually aborted. So now _region_finger
ysr@777 3452 // points to the address of the object we last scanned. If we
ysr@777 3453 // leave it there, when we restart this task, we will rescan
ysr@777 3454 // the object. It is easy to avoid this. We move the finger by
ysr@777 3455 // enough to point to the next possible object header (the
ysr@777 3456 // bitmap knows by how much we need to move it as it knows its
ysr@777 3457 // granularity).
ysr@777 3458 MemRegion newRegion =
ysr@777 3459 MemRegion(_nextMarkBitMap->nextWord(_region_finger), mr.end());
ysr@777 3460
ysr@777 3461 if (!newRegion.is_empty()) {
ysr@777 3462 if (_cm->verbose_low()) {
ysr@777 3463 gclog_or_tty->print_cr("[%d] pushing unscanned region"
ysr@777 3464 "[" PTR_FORMAT "," PTR_FORMAT ") on region stack",
ysr@777 3465 _task_id,
ysr@777 3466 newRegion.start(), newRegion.end());
ysr@777 3467 }
ysr@777 3468 // Now push the part of the region we didn't scan on the
ysr@777 3469 // region stack to make sure a task scans it later.
ysr@777 3470 _cm->region_stack_push(newRegion);
ysr@777 3471 }
ysr@777 3472 // break from while
ysr@777 3473 mr = MemRegion();
ysr@777 3474 }
ysr@777 3475 _region_finger = NULL;
ysr@777 3476 }
ysr@777 3477
ysr@777 3478 // We only push regions on the region stack during evacuation
ysr@777 3479 // pauses. So if we come out the above iteration because we region
ysr@777 3480 // stack is empty, it will remain empty until the next yield
ysr@777 3481 // point. So, the guarantee below is safe.
ysr@777 3482 guarantee( has_aborted() || _cm->region_stack_empty(),
ysr@777 3483 "only way to exit the loop" );
ysr@777 3484
ysr@777 3485 if (_cm->verbose_low())
ysr@777 3486 gclog_or_tty->print_cr("[%d] drained region stack, size = %d",
ysr@777 3487 _task_id, _cm->region_stack_size());
ysr@777 3488 }
ysr@777 3489 }
ysr@777 3490
ysr@777 3491 void CMTask::print_stats() {
ysr@777 3492 gclog_or_tty->print_cr("Marking Stats, task = %d, calls = %d",
ysr@777 3493 _task_id, _calls);
ysr@777 3494 gclog_or_tty->print_cr(" Elapsed time = %1.2lfms, Termination time = %1.2lfms",
ysr@777 3495 _elapsed_time_ms, _termination_time_ms);
ysr@777 3496 gclog_or_tty->print_cr(" Step Times (cum): num = %d, avg = %1.2lfms, sd = %1.2lfms",
ysr@777 3497 _step_times_ms.num(), _step_times_ms.avg(),
ysr@777 3498 _step_times_ms.sd());
ysr@777 3499 gclog_or_tty->print_cr(" max = %1.2lfms, total = %1.2lfms",
ysr@777 3500 _step_times_ms.maximum(), _step_times_ms.sum());
ysr@777 3501
ysr@777 3502 #if _MARKING_STATS_
ysr@777 3503 gclog_or_tty->print_cr(" Clock Intervals (cum): num = %d, avg = %1.2lfms, sd = %1.2lfms",
ysr@777 3504 _all_clock_intervals_ms.num(), _all_clock_intervals_ms.avg(),
ysr@777 3505 _all_clock_intervals_ms.sd());
ysr@777 3506 gclog_or_tty->print_cr(" max = %1.2lfms, total = %1.2lfms",
ysr@777 3507 _all_clock_intervals_ms.maximum(),
ysr@777 3508 _all_clock_intervals_ms.sum());
ysr@777 3509 gclog_or_tty->print_cr(" Clock Causes (cum): scanning = %d, marking = %d",
ysr@777 3510 _clock_due_to_scanning, _clock_due_to_marking);
ysr@777 3511 gclog_or_tty->print_cr(" Objects: scanned = %d, found on the bitmap = %d",
ysr@777 3512 _objs_scanned, _objs_found_on_bitmap);
ysr@777 3513 gclog_or_tty->print_cr(" Local Queue: pushes = %d, pops = %d, max size = %d",
ysr@777 3514 _local_pushes, _local_pops, _local_max_size);
ysr@777 3515 gclog_or_tty->print_cr(" Global Stack: pushes = %d, pops = %d, max size = %d",
ysr@777 3516 _global_pushes, _global_pops, _global_max_size);
ysr@777 3517 gclog_or_tty->print_cr(" transfers to = %d, transfers from = %d",
ysr@777 3518 _global_transfers_to,_global_transfers_from);
ysr@777 3519 gclog_or_tty->print_cr(" Regions: claimed = %d, Region Stack: pops = %d",
ysr@777 3520 _regions_claimed, _region_stack_pops);
ysr@777 3521 gclog_or_tty->print_cr(" SATB buffers: processed = %d", _satb_buffers_processed);
ysr@777 3522 gclog_or_tty->print_cr(" Steals: attempts = %d, successes = %d",
ysr@777 3523 _steal_attempts, _steals);
ysr@777 3524 gclog_or_tty->print_cr(" Aborted: %d, due to", _aborted);
ysr@777 3525 gclog_or_tty->print_cr(" overflow: %d, global abort: %d, yield: %d",
ysr@777 3526 _aborted_overflow, _aborted_cm_aborted, _aborted_yield);
ysr@777 3527 gclog_or_tty->print_cr(" time out: %d, SATB: %d, termination: %d",
ysr@777 3528 _aborted_timed_out, _aborted_satb, _aborted_termination);
ysr@777 3529 #endif // _MARKING_STATS_
ysr@777 3530 }
ysr@777 3531
ysr@777 3532 /*****************************************************************************
ysr@777 3533
ysr@777 3534 The do_marking_step(time_target_ms) method is the building block
ysr@777 3535 of the parallel marking framework. It can be called in parallel
ysr@777 3536 with other invocations of do_marking_step() on different tasks
ysr@777 3537 (but only one per task, obviously) and concurrently with the
ysr@777 3538 mutator threads, or during remark, hence it eliminates the need
ysr@777 3539 for two versions of the code. When called during remark, it will
ysr@777 3540 pick up from where the task left off during the concurrent marking
ysr@777 3541 phase. Interestingly, tasks are also claimable during evacuation
ysr@777 3542 pauses too, since do_marking_step() ensures that it aborts before
ysr@777 3543 it needs to yield.
ysr@777 3544
ysr@777 3545 The data structures that is uses to do marking work are the
ysr@777 3546 following:
ysr@777 3547
ysr@777 3548 (1) Marking Bitmap. If there are gray objects that appear only
ysr@777 3549 on the bitmap (this happens either when dealing with an overflow
ysr@777 3550 or when the initial marking phase has simply marked the roots
ysr@777 3551 and didn't push them on the stack), then tasks claim heap
ysr@777 3552 regions whose bitmap they then scan to find gray objects. A
ysr@777 3553 global finger indicates where the end of the last claimed region
ysr@777 3554 is. A local finger indicates how far into the region a task has
ysr@777 3555 scanned. The two fingers are used to determine how to gray an
ysr@777 3556 object (i.e. whether simply marking it is OK, as it will be
ysr@777 3557 visited by a task in the future, or whether it needs to be also
ysr@777 3558 pushed on a stack).
ysr@777 3559
ysr@777 3560 (2) Local Queue. The local queue of the task which is accessed
ysr@777 3561 reasonably efficiently by the task. Other tasks can steal from
ysr@777 3562 it when they run out of work. Throughout the marking phase, a
ysr@777 3563 task attempts to keep its local queue short but not totally
ysr@777 3564 empty, so that entries are available for stealing by other
ysr@777 3565 tasks. Only when there is no more work, a task will totally
ysr@777 3566 drain its local queue.
ysr@777 3567
ysr@777 3568 (3) Global Mark Stack. This handles local queue overflow. During
ysr@777 3569 marking only sets of entries are moved between it and the local
ysr@777 3570 queues, as access to it requires a mutex and more fine-grain
ysr@777 3571 interaction with it which might cause contention. If it
ysr@777 3572 overflows, then the marking phase should restart and iterate
ysr@777 3573 over the bitmap to identify gray objects. Throughout the marking
ysr@777 3574 phase, tasks attempt to keep the global mark stack at a small
ysr@777 3575 length but not totally empty, so that entries are available for
ysr@777 3576 popping by other tasks. Only when there is no more work, tasks
ysr@777 3577 will totally drain the global mark stack.
ysr@777 3578
ysr@777 3579 (4) Global Region Stack. Entries on it correspond to areas of
ysr@777 3580 the bitmap that need to be scanned since they contain gray
ysr@777 3581 objects. Pushes on the region stack only happen during
ysr@777 3582 evacuation pauses and typically correspond to areas covered by
ysr@777 3583 GC LABS. If it overflows, then the marking phase should restart
ysr@777 3584 and iterate over the bitmap to identify gray objects. Tasks will
ysr@777 3585 try to totally drain the region stack as soon as possible.
ysr@777 3586
ysr@777 3587 (5) SATB Buffer Queue. This is where completed SATB buffers are
ysr@777 3588 made available. Buffers are regularly removed from this queue
ysr@777 3589 and scanned for roots, so that the queue doesn't get too
ysr@777 3590 long. During remark, all completed buffers are processed, as
ysr@777 3591 well as the filled in parts of any uncompleted buffers.
ysr@777 3592
ysr@777 3593 The do_marking_step() method tries to abort when the time target
ysr@777 3594 has been reached. There are a few other cases when the
ysr@777 3595 do_marking_step() method also aborts:
ysr@777 3596
ysr@777 3597 (1) When the marking phase has been aborted (after a Full GC).
ysr@777 3598
ysr@777 3599 (2) When a global overflow (either on the global stack or the
ysr@777 3600 region stack) has been triggered. Before the task aborts, it
ysr@777 3601 will actually sync up with the other tasks to ensure that all
ysr@777 3602 the marking data structures (local queues, stacks, fingers etc.)
ysr@777 3603 are re-initialised so that when do_marking_step() completes,
ysr@777 3604 the marking phase can immediately restart.
ysr@777 3605
ysr@777 3606 (3) When enough completed SATB buffers are available. The
ysr@777 3607 do_marking_step() method only tries to drain SATB buffers right
ysr@777 3608 at the beginning. So, if enough buffers are available, the
ysr@777 3609 marking step aborts and the SATB buffers are processed at
ysr@777 3610 the beginning of the next invocation.
ysr@777 3611
ysr@777 3612 (4) To yield. when we have to yield then we abort and yield
ysr@777 3613 right at the end of do_marking_step(). This saves us from a lot
ysr@777 3614 of hassle as, by yielding we might allow a Full GC. If this
ysr@777 3615 happens then objects will be compacted underneath our feet, the
ysr@777 3616 heap might shrink, etc. We save checking for this by just
ysr@777 3617 aborting and doing the yield right at the end.
ysr@777 3618
ysr@777 3619 From the above it follows that the do_marking_step() method should
ysr@777 3620 be called in a loop (or, otherwise, regularly) until it completes.
ysr@777 3621
ysr@777 3622 If a marking step completes without its has_aborted() flag being
ysr@777 3623 true, it means it has completed the current marking phase (and
ysr@777 3624 also all other marking tasks have done so and have all synced up).
ysr@777 3625
ysr@777 3626 A method called regular_clock_call() is invoked "regularly" (in
ysr@777 3627 sub ms intervals) throughout marking. It is this clock method that
ysr@777 3628 checks all the abort conditions which were mentioned above and
ysr@777 3629 decides when the task should abort. A work-based scheme is used to
ysr@777 3630 trigger this clock method: when the number of object words the
ysr@777 3631 marking phase has scanned or the number of references the marking
ysr@777 3632 phase has visited reach a given limit. Additional invocations to
ysr@777 3633 the method clock have been planted in a few other strategic places
ysr@777 3634 too. The initial reason for the clock method was to avoid calling
ysr@777 3635 vtime too regularly, as it is quite expensive. So, once it was in
ysr@777 3636 place, it was natural to piggy-back all the other conditions on it
ysr@777 3637 too and not constantly check them throughout the code.
ysr@777 3638
ysr@777 3639 *****************************************************************************/
ysr@777 3640
ysr@777 3641 void CMTask::do_marking_step(double time_target_ms) {
ysr@777 3642 guarantee( time_target_ms >= 1.0, "minimum granularity is 1ms" );
ysr@777 3643 guarantee( concurrent() == _cm->concurrent(), "they should be the same" );
ysr@777 3644
ysr@777 3645 guarantee( concurrent() || _cm->region_stack_empty(),
ysr@777 3646 "the region stack should have been cleared before remark" );
ysr@777 3647 guarantee( _region_finger == NULL,
ysr@777 3648 "this should be non-null only when a region is being scanned" );
ysr@777 3649
ysr@777 3650 G1CollectorPolicy* g1_policy = _g1h->g1_policy();
ysr@777 3651 guarantee( _task_queues != NULL, "invariant" );
ysr@777 3652 guarantee( _task_queue != NULL, "invariant" );
ysr@777 3653 guarantee( _task_queues->queue(_task_id) == _task_queue, "invariant" );
ysr@777 3654
ysr@777 3655 guarantee( !_claimed,
ysr@777 3656 "only one thread should claim this task at any one time" );
ysr@777 3657
ysr@777 3658 // OK, this doesn't safeguard again all possible scenarios, as it is
ysr@777 3659 // possible for two threads to set the _claimed flag at the same
ysr@777 3660 // time. But it is only for debugging purposes anyway and it will
ysr@777 3661 // catch most problems.
ysr@777 3662 _claimed = true;
ysr@777 3663
ysr@777 3664 _start_time_ms = os::elapsedVTime() * 1000.0;
ysr@777 3665 statsOnly( _interval_start_time_ms = _start_time_ms );
ysr@777 3666
ysr@777 3667 double diff_prediction_ms =
ysr@777 3668 g1_policy->get_new_prediction(&_marking_step_diffs_ms);
ysr@777 3669 _time_target_ms = time_target_ms - diff_prediction_ms;
ysr@777 3670
ysr@777 3671 // set up the variables that are used in the work-based scheme to
ysr@777 3672 // call the regular clock method
ysr@777 3673 _words_scanned = 0;
ysr@777 3674 _refs_reached = 0;
ysr@777 3675 recalculate_limits();
ysr@777 3676
ysr@777 3677 // clear all flags
ysr@777 3678 clear_has_aborted();
ysr@777 3679 _has_aborted_timed_out = false;
ysr@777 3680 _draining_satb_buffers = false;
ysr@777 3681
ysr@777 3682 ++_calls;
ysr@777 3683
ysr@777 3684 if (_cm->verbose_low())
ysr@777 3685 gclog_or_tty->print_cr("[%d] >>>>>>>>>> START, call = %d, "
ysr@777 3686 "target = %1.2lfms >>>>>>>>>>",
ysr@777 3687 _task_id, _calls, _time_target_ms);
ysr@777 3688
ysr@777 3689 // Set up the bitmap and oop closures. Anything that uses them is
ysr@777 3690 // eventually called from this method, so it is OK to allocate these
ysr@777 3691 // statically.
ysr@777 3692 CMBitMapClosure bitmap_closure(this, _cm, _nextMarkBitMap);
ysr@777 3693 CMOopClosure oop_closure(_g1h, _cm, this);
ysr@777 3694 set_oop_closure(&oop_closure);
ysr@777 3695
ysr@777 3696 if (_cm->has_overflown()) {
ysr@777 3697 // This can happen if the region stack or the mark stack overflows
ysr@777 3698 // during a GC pause and this task, after a yield point,
ysr@777 3699 // restarts. We have to abort as we need to get into the overflow
ysr@777 3700 // protocol which happens right at the end of this task.
ysr@777 3701 set_has_aborted();
ysr@777 3702 }
ysr@777 3703
ysr@777 3704 // First drain any available SATB buffers. After this, we will not
ysr@777 3705 // look at SATB buffers before the next invocation of this method.
ysr@777 3706 // If enough completed SATB buffers are queued up, the regular clock
ysr@777 3707 // will abort this task so that it restarts.
ysr@777 3708 drain_satb_buffers();
ysr@777 3709 // ...then partially drain the local queue and the global stack
ysr@777 3710 drain_local_queue(true);
ysr@777 3711 drain_global_stack(true);
ysr@777 3712
ysr@777 3713 // Then totally drain the region stack. We will not look at
ysr@777 3714 // it again before the next invocation of this method. Entries on
ysr@777 3715 // the region stack are only added during evacuation pauses, for
ysr@777 3716 // which we have to yield. When we do, we abort the task anyway so
ysr@777 3717 // it will look at the region stack again when it restarts.
ysr@777 3718 bitmap_closure.set_scanning_heap_region(false);
ysr@777 3719 drain_region_stack(&bitmap_closure);
ysr@777 3720 // ...then partially drain the local queue and the global stack
ysr@777 3721 drain_local_queue(true);
ysr@777 3722 drain_global_stack(true);
ysr@777 3723
ysr@777 3724 do {
ysr@777 3725 if (!has_aborted() && _curr_region != NULL) {
ysr@777 3726 // This means that we're already holding on to a region.
ysr@777 3727 tmp_guarantee_CM( _finger != NULL,
ysr@777 3728 "if region is not NULL, then the finger "
ysr@777 3729 "should not be NULL either" );
ysr@777 3730
ysr@777 3731 // We might have restarted this task after an evacuation pause
ysr@777 3732 // which might have evacuated the region we're holding on to
ysr@777 3733 // underneath our feet. Let's read its limit again to make sure
ysr@777 3734 // that we do not iterate over a region of the heap that
ysr@777 3735 // contains garbage (update_region_limit() will also move
ysr@777 3736 // _finger to the start of the region if it is found empty).
ysr@777 3737 update_region_limit();
ysr@777 3738 // We will start from _finger not from the start of the region,
ysr@777 3739 // as we might be restarting this task after aborting half-way
ysr@777 3740 // through scanning this region. In this case, _finger points to
ysr@777 3741 // the address where we last found a marked object. If this is a
ysr@777 3742 // fresh region, _finger points to start().
ysr@777 3743 MemRegion mr = MemRegion(_finger, _region_limit);
ysr@777 3744
ysr@777 3745 if (_cm->verbose_low())
ysr@777 3746 gclog_or_tty->print_cr("[%d] we're scanning part "
ysr@777 3747 "["PTR_FORMAT", "PTR_FORMAT") "
ysr@777 3748 "of region "PTR_FORMAT,
ysr@777 3749 _task_id, _finger, _region_limit, _curr_region);
ysr@777 3750
ysr@777 3751 // Let's iterate over the bitmap of the part of the
ysr@777 3752 // region that is left.
ysr@777 3753 bitmap_closure.set_scanning_heap_region(true);
ysr@777 3754 if (mr.is_empty() ||
ysr@777 3755 _nextMarkBitMap->iterate(&bitmap_closure, mr)) {
ysr@777 3756 // We successfully completed iterating over the region. Now,
ysr@777 3757 // let's give up the region.
ysr@777 3758 giveup_current_region();
ysr@777 3759 regular_clock_call();
ysr@777 3760 } else {
ysr@777 3761 guarantee( has_aborted(), "currently the only way to do so" );
ysr@777 3762 // The only way to abort the bitmap iteration is to return
ysr@777 3763 // false from the do_bit() method. However, inside the
ysr@777 3764 // do_bit() method we move the _finger to point to the
ysr@777 3765 // object currently being looked at. So, if we bail out, we
ysr@777 3766 // have definitely set _finger to something non-null.
ysr@777 3767 guarantee( _finger != NULL, "invariant" );
ysr@777 3768
ysr@777 3769 // Region iteration was actually aborted. So now _finger
ysr@777 3770 // points to the address of the object we last scanned. If we
ysr@777 3771 // leave it there, when we restart this task, we will rescan
ysr@777 3772 // the object. It is easy to avoid this. We move the finger by
ysr@777 3773 // enough to point to the next possible object header (the
ysr@777 3774 // bitmap knows by how much we need to move it as it knows its
ysr@777 3775 // granularity).
ysr@777 3776 move_finger_to(_nextMarkBitMap->nextWord(_finger));
ysr@777 3777 }
ysr@777 3778 }
ysr@777 3779 // At this point we have either completed iterating over the
ysr@777 3780 // region we were holding on to, or we have aborted.
ysr@777 3781
ysr@777 3782 // We then partially drain the local queue and the global stack.
ysr@777 3783 // (Do we really need this?)
ysr@777 3784 drain_local_queue(true);
ysr@777 3785 drain_global_stack(true);
ysr@777 3786
ysr@777 3787 // Read the note on the claim_region() method on why it might
ysr@777 3788 // return NULL with potentially more regions available for
ysr@777 3789 // claiming and why we have to check out_of_regions() to determine
ysr@777 3790 // whether we're done or not.
ysr@777 3791 while (!has_aborted() && _curr_region == NULL && !_cm->out_of_regions()) {
ysr@777 3792 // We are going to try to claim a new region. We should have
ysr@777 3793 // given up on the previous one.
ysr@777 3794 tmp_guarantee_CM( _curr_region == NULL &&
ysr@777 3795 _finger == NULL &&
ysr@777 3796 _region_limit == NULL, "invariant" );
ysr@777 3797 if (_cm->verbose_low())
ysr@777 3798 gclog_or_tty->print_cr("[%d] trying to claim a new region", _task_id);
ysr@777 3799 HeapRegion* claimed_region = _cm->claim_region(_task_id);
ysr@777 3800 if (claimed_region != NULL) {
ysr@777 3801 // Yes, we managed to claim one
ysr@777 3802 statsOnly( ++_regions_claimed );
ysr@777 3803
ysr@777 3804 if (_cm->verbose_low())
ysr@777 3805 gclog_or_tty->print_cr("[%d] we successfully claimed "
ysr@777 3806 "region "PTR_FORMAT,
ysr@777 3807 _task_id, claimed_region);
ysr@777 3808
ysr@777 3809 setup_for_region(claimed_region);
ysr@777 3810 tmp_guarantee_CM( _curr_region == claimed_region, "invariant" );
ysr@777 3811 }
ysr@777 3812 // It is important to call the regular clock here. It might take
ysr@777 3813 // a while to claim a region if, for example, we hit a large
ysr@777 3814 // block of empty regions. So we need to call the regular clock
ysr@777 3815 // method once round the loop to make sure it's called
ysr@777 3816 // frequently enough.
ysr@777 3817 regular_clock_call();
ysr@777 3818 }
ysr@777 3819
ysr@777 3820 if (!has_aborted() && _curr_region == NULL) {
ysr@777 3821 tmp_guarantee_CM( _cm->out_of_regions(),
ysr@777 3822 "at this point we should be out of regions" );
ysr@777 3823 }
ysr@777 3824 } while ( _curr_region != NULL && !has_aborted());
ysr@777 3825
ysr@777 3826 if (!has_aborted()) {
ysr@777 3827 // We cannot check whether the global stack is empty, since other
iveresov@778 3828 // tasks might be pushing objects to it concurrently. We also cannot
iveresov@778 3829 // check if the region stack is empty because if a thread is aborting
iveresov@778 3830 // it can push a partially done region back.
iveresov@778 3831 tmp_guarantee_CM( _cm->out_of_regions(),
ysr@777 3832 "at this point we should be out of regions" );
ysr@777 3833
ysr@777 3834 if (_cm->verbose_low())
ysr@777 3835 gclog_or_tty->print_cr("[%d] all regions claimed", _task_id);
ysr@777 3836
ysr@777 3837 // Try to reduce the number of available SATB buffers so that
ysr@777 3838 // remark has less work to do.
ysr@777 3839 drain_satb_buffers();
ysr@777 3840 }
ysr@777 3841
ysr@777 3842 // Since we've done everything else, we can now totally drain the
ysr@777 3843 // local queue and global stack.
ysr@777 3844 drain_local_queue(false);
ysr@777 3845 drain_global_stack(false);
ysr@777 3846
ysr@777 3847 // Attempt at work stealing from other task's queues.
ysr@777 3848 if (!has_aborted()) {
ysr@777 3849 // We have not aborted. This means that we have finished all that
ysr@777 3850 // we could. Let's try to do some stealing...
ysr@777 3851
ysr@777 3852 // We cannot check whether the global stack is empty, since other
iveresov@778 3853 // tasks might be pushing objects to it concurrently. We also cannot
iveresov@778 3854 // check if the region stack is empty because if a thread is aborting
iveresov@778 3855 // it can push a partially done region back.
ysr@777 3856 guarantee( _cm->out_of_regions() &&
ysr@777 3857 _task_queue->size() == 0, "only way to reach here" );
ysr@777 3858
ysr@777 3859 if (_cm->verbose_low())
ysr@777 3860 gclog_or_tty->print_cr("[%d] starting to steal", _task_id);
ysr@777 3861
ysr@777 3862 while (!has_aborted()) {
ysr@777 3863 oop obj;
ysr@777 3864 statsOnly( ++_steal_attempts );
ysr@777 3865
ysr@777 3866 if (_cm->try_stealing(_task_id, &_hash_seed, obj)) {
ysr@777 3867 if (_cm->verbose_medium())
ysr@777 3868 gclog_or_tty->print_cr("[%d] stolen "PTR_FORMAT" successfully",
ysr@777 3869 _task_id, (void*) obj);
ysr@777 3870
ysr@777 3871 statsOnly( ++_steals );
ysr@777 3872
ysr@777 3873 tmp_guarantee_CM( _nextMarkBitMap->isMarked((HeapWord*) obj),
ysr@777 3874 "any stolen object should be marked" );
ysr@777 3875 scan_object(obj);
ysr@777 3876
ysr@777 3877 // And since we're towards the end, let's totally drain the
ysr@777 3878 // local queue and global stack.
ysr@777 3879 drain_local_queue(false);
ysr@777 3880 drain_global_stack(false);
ysr@777 3881 } else {
ysr@777 3882 break;
ysr@777 3883 }
ysr@777 3884 }
ysr@777 3885 }
ysr@777 3886
ysr@777 3887 // We still haven't aborted. Now, let's try to get into the
ysr@777 3888 // termination protocol.
ysr@777 3889 if (!has_aborted()) {
ysr@777 3890 // We cannot check whether the global stack is empty, since other
iveresov@778 3891 // tasks might be concurrently pushing objects on it. We also cannot
iveresov@778 3892 // check if the region stack is empty because if a thread is aborting
iveresov@778 3893 // it can push a partially done region back.
ysr@777 3894 guarantee( _cm->out_of_regions() &&
ysr@777 3895 _task_queue->size() == 0, "only way to reach here" );
ysr@777 3896
ysr@777 3897 if (_cm->verbose_low())
ysr@777 3898 gclog_or_tty->print_cr("[%d] starting termination protocol", _task_id);
ysr@777 3899
ysr@777 3900 _termination_start_time_ms = os::elapsedVTime() * 1000.0;
ysr@777 3901 // The CMTask class also extends the TerminatorTerminator class,
ysr@777 3902 // hence its should_exit_termination() method will also decide
ysr@777 3903 // whether to exit the termination protocol or not.
ysr@777 3904 bool finished = _cm->terminator()->offer_termination(this);
ysr@777 3905 double termination_end_time_ms = os::elapsedVTime() * 1000.0;
ysr@777 3906 _termination_time_ms +=
ysr@777 3907 termination_end_time_ms - _termination_start_time_ms;
ysr@777 3908
ysr@777 3909 if (finished) {
ysr@777 3910 // We're all done.
ysr@777 3911
ysr@777 3912 if (_task_id == 0) {
ysr@777 3913 // let's allow task 0 to do this
ysr@777 3914 if (concurrent()) {
ysr@777 3915 guarantee( _cm->concurrent_marking_in_progress(), "invariant" );
ysr@777 3916 // we need to set this to false before the next
ysr@777 3917 // safepoint. This way we ensure that the marking phase
ysr@777 3918 // doesn't observe any more heap expansions.
ysr@777 3919 _cm->clear_concurrent_marking_in_progress();
ysr@777 3920 }
ysr@777 3921 }
ysr@777 3922
ysr@777 3923 // We can now guarantee that the global stack is empty, since
ysr@777 3924 // all other tasks have finished.
ysr@777 3925 guarantee( _cm->out_of_regions() &&
ysr@777 3926 _cm->region_stack_empty() &&
ysr@777 3927 _cm->mark_stack_empty() &&
ysr@777 3928 _task_queue->size() == 0 &&
ysr@777 3929 !_cm->has_overflown() &&
ysr@777 3930 !_cm->mark_stack_overflow() &&
ysr@777 3931 !_cm->region_stack_overflow(),
ysr@777 3932 "only way to reach here" );
ysr@777 3933
ysr@777 3934 if (_cm->verbose_low())
ysr@777 3935 gclog_or_tty->print_cr("[%d] all tasks terminated", _task_id);
ysr@777 3936 } else {
ysr@777 3937 // Apparently there's more work to do. Let's abort this task. It
ysr@777 3938 // will restart it and we can hopefully find more things to do.
ysr@777 3939
ysr@777 3940 if (_cm->verbose_low())
ysr@777 3941 gclog_or_tty->print_cr("[%d] apparently there is more work to do", _task_id);
ysr@777 3942
ysr@777 3943 set_has_aborted();
ysr@777 3944 statsOnly( ++_aborted_termination );
ysr@777 3945 }
ysr@777 3946 }
ysr@777 3947
ysr@777 3948 // Mainly for debugging purposes to make sure that a pointer to the
ysr@777 3949 // closure which was statically allocated in this frame doesn't
ysr@777 3950 // escape it by accident.
ysr@777 3951 set_oop_closure(NULL);
ysr@777 3952 double end_time_ms = os::elapsedVTime() * 1000.0;
ysr@777 3953 double elapsed_time_ms = end_time_ms - _start_time_ms;
ysr@777 3954 // Update the step history.
ysr@777 3955 _step_times_ms.add(elapsed_time_ms);
ysr@777 3956
ysr@777 3957 if (has_aborted()) {
ysr@777 3958 // The task was aborted for some reason.
ysr@777 3959
ysr@777 3960 statsOnly( ++_aborted );
ysr@777 3961
ysr@777 3962 if (_has_aborted_timed_out) {
ysr@777 3963 double diff_ms = elapsed_time_ms - _time_target_ms;
ysr@777 3964 // Keep statistics of how well we did with respect to hitting
ysr@777 3965 // our target only if we actually timed out (if we aborted for
ysr@777 3966 // other reasons, then the results might get skewed).
ysr@777 3967 _marking_step_diffs_ms.add(diff_ms);
ysr@777 3968 }
ysr@777 3969
ysr@777 3970 if (_cm->has_overflown()) {
ysr@777 3971 // This is the interesting one. We aborted because a global
ysr@777 3972 // overflow was raised. This means we have to restart the
ysr@777 3973 // marking phase and start iterating over regions. However, in
ysr@777 3974 // order to do this we have to make sure that all tasks stop
ysr@777 3975 // what they are doing and re-initialise in a safe manner. We
ysr@777 3976 // will achieve this with the use of two barrier sync points.
ysr@777 3977
ysr@777 3978 if (_cm->verbose_low())
ysr@777 3979 gclog_or_tty->print_cr("[%d] detected overflow", _task_id);
ysr@777 3980
ysr@777 3981 _cm->enter_first_sync_barrier(_task_id);
ysr@777 3982 // When we exit this sync barrier we know that all tasks have
ysr@777 3983 // stopped doing marking work. So, it's now safe to
ysr@777 3984 // re-initialise our data structures. At the end of this method,
ysr@777 3985 // task 0 will clear the global data structures.
ysr@777 3986
ysr@777 3987 statsOnly( ++_aborted_overflow );
ysr@777 3988
ysr@777 3989 // We clear the local state of this task...
ysr@777 3990 clear_region_fields();
ysr@777 3991
ysr@777 3992 // ...and enter the second barrier.
ysr@777 3993 _cm->enter_second_sync_barrier(_task_id);
ysr@777 3994 // At this point everything has bee re-initialised and we're
ysr@777 3995 // ready to restart.
ysr@777 3996 }
ysr@777 3997
ysr@777 3998 if (_cm->verbose_low()) {
ysr@777 3999 gclog_or_tty->print_cr("[%d] <<<<<<<<<< ABORTING, target = %1.2lfms, "
ysr@777 4000 "elapsed = %1.2lfms <<<<<<<<<<",
ysr@777 4001 _task_id, _time_target_ms, elapsed_time_ms);
ysr@777 4002 if (_cm->has_aborted())
ysr@777 4003 gclog_or_tty->print_cr("[%d] ========== MARKING ABORTED ==========",
ysr@777 4004 _task_id);
ysr@777 4005 }
ysr@777 4006 } else {
ysr@777 4007 if (_cm->verbose_low())
ysr@777 4008 gclog_or_tty->print_cr("[%d] <<<<<<<<<< FINISHED, target = %1.2lfms, "
ysr@777 4009 "elapsed = %1.2lfms <<<<<<<<<<",
ysr@777 4010 _task_id, _time_target_ms, elapsed_time_ms);
ysr@777 4011 }
ysr@777 4012
ysr@777 4013 _claimed = false;
ysr@777 4014 }
ysr@777 4015
ysr@777 4016 CMTask::CMTask(int task_id,
ysr@777 4017 ConcurrentMark* cm,
ysr@777 4018 CMTaskQueue* task_queue,
ysr@777 4019 CMTaskQueueSet* task_queues)
ysr@777 4020 : _g1h(G1CollectedHeap::heap()),
ysr@777 4021 _co_tracker(G1CMGroup),
ysr@777 4022 _task_id(task_id), _cm(cm),
ysr@777 4023 _claimed(false),
ysr@777 4024 _nextMarkBitMap(NULL), _hash_seed(17),
ysr@777 4025 _task_queue(task_queue),
ysr@777 4026 _task_queues(task_queues),
ysr@777 4027 _oop_closure(NULL) {
ysr@777 4028 guarantee( task_queue != NULL, "invariant" );
ysr@777 4029 guarantee( task_queues != NULL, "invariant" );
ysr@777 4030
ysr@777 4031 statsOnly( _clock_due_to_scanning = 0;
ysr@777 4032 _clock_due_to_marking = 0 );
ysr@777 4033
ysr@777 4034 _marking_step_diffs_ms.add(0.5);
ysr@777 4035 }

mercurial