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

Mon, 02 Aug 2010 12:51:43 -0700

author
johnc
date
Mon, 02 Aug 2010 12:51:43 -0700
changeset 2060
2d160770d2e5
parent 1907
c18cbe5936b8
child 2074
b63010841f78
permissions
-rw-r--r--

6814437: G1: remove the _new_refs array
Summary: The per-worker _new_refs array is used to hold references that point into the collection set. It is populated during RSet updating and subsequently processed. In the event of an evacuation failure it processed again to recreate the RSets of regions in the collection set. Remove the per-worker _new_refs array by processing the references directly. Use a DirtyCardQueue to hold the cards containing the references so that the RSets of regions in the collection set can be recreated when handling an evacuation failure.
Reviewed-by: iveresov, jmasa, tonyp

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

mercurial