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

Tue, 25 Jan 2011 17:58:19 -0500

author
tonyp
date
Tue, 25 Jan 2011 17:58:19 -0500
changeset 2493
97ba643ea3ed
parent 2472
0fa27f37d4d4
child 2495
81668b1f4877
permissions
-rw-r--r--

7014261: G1: RSet-related failures
Summary: A race between the concurrent cleanup thread and the VM thread while it is processing the "expanded sparse table list" causes both threads to try to free the same sparse table entry and either causes one of the threads to fail or leaves the entry in an inconsistent state. The solution is purge all entries on the expanded list that correspond go regions that are being cleaned up.
Reviewed-by: brutisso, johnc

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

mercurial