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

Thu, 18 Mar 2010 01:48:28 -0700

author
apetrusenko
date
Thu, 18 Mar 2010 01:48:28 -0700
changeset 1749
3f0549ed0c98
parent 1719
5f1f51edaff6
child 1752
d4197f8d516a
permissions
-rw-r--r--

6921710: G1: assert(new_finger >= _finger && new_finger < _region_limit,"invariant")
Summary: If CM task was aborted while scanning the last object of the specified region and the size of that object is equal to bitmap's granularity then the next offset would be equal or over the region limit which is exactly what the assertion states.
Reviewed-by: ysr, tonyp, jmasa

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

mercurial