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

Thu, 17 Nov 2011 12:40:15 -0800

author
johnc
date
Thu, 17 Nov 2011 12:40:15 -0800
changeset 3296
dc467e8b2c5e
parent 3294
bca17e38de00
child 3338
adedfbbf0360
permissions
-rw-r--r--

7112743: G1: Reduce overhead of marking closure during evacuation pauses
Summary: Parallelize the serial code that was used to mark objects reachable from survivor objects in the collection set. Some minor improvments in the timers used to track the freeing of the collection set along with some tweaks to PrintGCDetails.
Reviewed-by: tonyp, brutisso

ysr@777 1 /*
tonyp@2472 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 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_CONCURRENTMARK_HPP
stefank@2314 26 #define SHARE_VM_GC_IMPLEMENTATION_G1_CONCURRENTMARK_HPP
stefank@2314 27
tonyp@2472 28 #include "gc_implementation/g1/heapRegionSets.hpp"
stefank@2314 29 #include "utilities/taskqueue.hpp"
stefank@2314 30
ysr@777 31 class G1CollectedHeap;
ysr@777 32 class CMTask;
jcoomes@1746 33 typedef GenericTaskQueue<oop> CMTaskQueue;
jcoomes@1746 34 typedef GenericTaskQueueSet<CMTaskQueue> CMTaskQueueSet;
ysr@777 35
johnc@2379 36 // Closure used by CM during concurrent reference discovery
johnc@2379 37 // and reference processing (during remarking) to determine
johnc@2379 38 // if a particular object is alive. It is primarily used
johnc@2379 39 // to determine if referents of discovered reference objects
johnc@2379 40 // are alive. An instance is also embedded into the
johnc@2379 41 // reference processor as the _is_alive_non_header field
johnc@2379 42 class G1CMIsAliveClosure: public BoolObjectClosure {
johnc@2379 43 G1CollectedHeap* _g1;
johnc@2379 44 public:
johnc@2379 45 G1CMIsAliveClosure(G1CollectedHeap* g1) :
johnc@2379 46 _g1(g1)
johnc@2379 47 {}
johnc@2379 48
johnc@2379 49 void do_object(oop obj) {
johnc@2379 50 ShouldNotCallThis();
johnc@2379 51 }
johnc@2379 52 bool do_object_b(oop obj);
johnc@2379 53 };
johnc@2379 54
ysr@777 55 // A generic CM bit map. This is essentially a wrapper around the BitMap
ysr@777 56 // class, with one bit per (1<<_shifter) HeapWords.
ysr@777 57
apetrusenko@984 58 class CMBitMapRO VALUE_OBJ_CLASS_SPEC {
ysr@777 59 protected:
ysr@777 60 HeapWord* _bmStartWord; // base address of range covered by map
ysr@777 61 size_t _bmWordSize; // map size (in #HeapWords covered)
ysr@777 62 const int _shifter; // map to char or bit
ysr@777 63 VirtualSpace _virtual_space; // underlying the bit map
ysr@777 64 BitMap _bm; // the bit map itself
ysr@777 65
ysr@777 66 public:
ysr@777 67 // constructor
ysr@777 68 CMBitMapRO(ReservedSpace rs, int shifter);
ysr@777 69
ysr@777 70 enum { do_yield = true };
ysr@777 71
ysr@777 72 // inquiries
ysr@777 73 HeapWord* startWord() const { return _bmStartWord; }
ysr@777 74 size_t sizeInWords() const { return _bmWordSize; }
ysr@777 75 // the following is one past the last word in space
ysr@777 76 HeapWord* endWord() const { return _bmStartWord + _bmWordSize; }
ysr@777 77
ysr@777 78 // read marks
ysr@777 79
ysr@777 80 bool isMarked(HeapWord* addr) const {
ysr@777 81 assert(_bmStartWord <= addr && addr < (_bmStartWord + _bmWordSize),
ysr@777 82 "outside underlying space?");
ysr@777 83 return _bm.at(heapWordToOffset(addr));
ysr@777 84 }
ysr@777 85
ysr@777 86 // iteration
ysr@777 87 bool iterate(BitMapClosure* cl) { return _bm.iterate(cl); }
ysr@777 88 bool iterate(BitMapClosure* cl, MemRegion mr);
ysr@777 89
ysr@777 90 // Return the address corresponding to the next marked bit at or after
ysr@777 91 // "addr", and before "limit", if "limit" is non-NULL. If there is no
ysr@777 92 // such bit, returns "limit" if that is non-NULL, or else "endWord()".
ysr@777 93 HeapWord* getNextMarkedWordAddress(HeapWord* addr,
ysr@777 94 HeapWord* limit = NULL) const;
ysr@777 95 // Return the address corresponding to the next unmarked bit at or after
ysr@777 96 // "addr", and before "limit", if "limit" is non-NULL. If there is no
ysr@777 97 // such bit, returns "limit" if that is non-NULL, or else "endWord()".
ysr@777 98 HeapWord* getNextUnmarkedWordAddress(HeapWord* addr,
ysr@777 99 HeapWord* limit = NULL) const;
ysr@777 100
ysr@777 101 // conversion utilities
ysr@777 102 // XXX Fix these so that offsets are size_t's...
ysr@777 103 HeapWord* offsetToHeapWord(size_t offset) const {
ysr@777 104 return _bmStartWord + (offset << _shifter);
ysr@777 105 }
ysr@777 106 size_t heapWordToOffset(HeapWord* addr) const {
ysr@777 107 return pointer_delta(addr, _bmStartWord) >> _shifter;
ysr@777 108 }
ysr@777 109 int heapWordDiffToOffsetDiff(size_t diff) const;
ysr@777 110 HeapWord* nextWord(HeapWord* addr) {
ysr@777 111 return offsetToHeapWord(heapWordToOffset(addr) + 1);
ysr@777 112 }
ysr@777 113
ysr@777 114 void mostly_disjoint_range_union(BitMap* from_bitmap,
ysr@777 115 size_t from_start_index,
ysr@777 116 HeapWord* to_start_word,
ysr@777 117 size_t word_num);
ysr@777 118
ysr@777 119 // debugging
ysr@777 120 NOT_PRODUCT(bool covers(ReservedSpace rs) const;)
ysr@777 121 };
ysr@777 122
ysr@777 123 class CMBitMap : public CMBitMapRO {
ysr@777 124
ysr@777 125 public:
ysr@777 126 // constructor
ysr@777 127 CMBitMap(ReservedSpace rs, int shifter) :
ysr@777 128 CMBitMapRO(rs, shifter) {}
ysr@777 129
ysr@777 130 // write marks
ysr@777 131 void mark(HeapWord* addr) {
ysr@777 132 assert(_bmStartWord <= addr && addr < (_bmStartWord + _bmWordSize),
ysr@777 133 "outside underlying space?");
tonyp@2968 134 _bm.set_bit(heapWordToOffset(addr));
ysr@777 135 }
ysr@777 136 void clear(HeapWord* addr) {
ysr@777 137 assert(_bmStartWord <= addr && addr < (_bmStartWord + _bmWordSize),
ysr@777 138 "outside underlying space?");
tonyp@2968 139 _bm.clear_bit(heapWordToOffset(addr));
ysr@777 140 }
ysr@777 141 bool parMark(HeapWord* addr) {
ysr@777 142 assert(_bmStartWord <= addr && addr < (_bmStartWord + _bmWordSize),
ysr@777 143 "outside underlying space?");
tonyp@2968 144 return _bm.par_set_bit(heapWordToOffset(addr));
ysr@777 145 }
ysr@777 146 bool parClear(HeapWord* addr) {
ysr@777 147 assert(_bmStartWord <= addr && addr < (_bmStartWord + _bmWordSize),
ysr@777 148 "outside underlying space?");
tonyp@2968 149 return _bm.par_clear_bit(heapWordToOffset(addr));
ysr@777 150 }
ysr@777 151 void markRange(MemRegion mr);
ysr@777 152 void clearAll();
ysr@777 153 void clearRange(MemRegion mr);
ysr@777 154
ysr@777 155 // Starting at the bit corresponding to "addr" (inclusive), find the next
ysr@777 156 // "1" bit, if any. This bit starts some run of consecutive "1"'s; find
ysr@777 157 // the end of this run (stopping at "end_addr"). Return the MemRegion
ysr@777 158 // covering from the start of the region corresponding to the first bit
ysr@777 159 // of the run to the end of the region corresponding to the last bit of
ysr@777 160 // the run. If there is no "1" bit at or after "addr", return an empty
ysr@777 161 // MemRegion.
ysr@777 162 MemRegion getAndClearMarkedRegion(HeapWord* addr, HeapWord* end_addr);
ysr@777 163 };
ysr@777 164
ysr@777 165 // Represents a marking stack used by the CM collector.
ysr@777 166 // Ideally this should be GrowableArray<> just like MSC's marking stack(s).
apetrusenko@984 167 class CMMarkStack VALUE_OBJ_CLASS_SPEC {
ysr@777 168 ConcurrentMark* _cm;
ysr@777 169 oop* _base; // bottom of stack
ysr@777 170 jint _index; // one more than last occupied index
ysr@777 171 jint _capacity; // max #elements
ysr@777 172 jint _oops_do_bound; // Number of elements to include in next iteration.
ysr@777 173 NOT_PRODUCT(jint _max_depth;) // max depth plumbed during run
ysr@777 174
ysr@777 175 bool _overflow;
ysr@777 176 DEBUG_ONLY(bool _drain_in_progress;)
ysr@777 177 DEBUG_ONLY(bool _drain_in_progress_yields;)
ysr@777 178
ysr@777 179 public:
ysr@777 180 CMMarkStack(ConcurrentMark* cm);
ysr@777 181 ~CMMarkStack();
ysr@777 182
ysr@777 183 void allocate(size_t size);
ysr@777 184
ysr@777 185 oop pop() {
ysr@777 186 if (!isEmpty()) {
ysr@777 187 return _base[--_index] ;
ysr@777 188 }
ysr@777 189 return NULL;
ysr@777 190 }
ysr@777 191
ysr@777 192 // If overflow happens, don't do the push, and record the overflow.
ysr@777 193 // *Requires* that "ptr" is already marked.
ysr@777 194 void push(oop ptr) {
ysr@777 195 if (isFull()) {
ysr@777 196 // Record overflow.
ysr@777 197 _overflow = true;
ysr@777 198 return;
ysr@777 199 } else {
ysr@777 200 _base[_index++] = ptr;
ysr@777 201 NOT_PRODUCT(_max_depth = MAX2(_max_depth, _index));
ysr@777 202 }
ysr@777 203 }
ysr@777 204 // Non-block impl. Note: concurrency is allowed only with other
ysr@777 205 // "par_push" operations, not with "pop" or "drain". We would need
ysr@777 206 // parallel versions of them if such concurrency was desired.
ysr@777 207 void par_push(oop ptr);
ysr@777 208
ysr@777 209 // Pushes the first "n" elements of "ptr_arr" on the stack.
ysr@777 210 // Non-block impl. Note: concurrency is allowed only with other
ysr@777 211 // "par_adjoin_arr" or "push" operations, not with "pop" or "drain".
ysr@777 212 void par_adjoin_arr(oop* ptr_arr, int n);
ysr@777 213
ysr@777 214 // Pushes the first "n" elements of "ptr_arr" on the stack.
ysr@777 215 // Locking impl: concurrency is allowed only with
ysr@777 216 // "par_push_arr" and/or "par_pop_arr" operations, which use the same
ysr@777 217 // locking strategy.
ysr@777 218 void par_push_arr(oop* ptr_arr, int n);
ysr@777 219
ysr@777 220 // If returns false, the array was empty. Otherwise, removes up to "max"
ysr@777 221 // elements from the stack, and transfers them to "ptr_arr" in an
ysr@777 222 // unspecified order. The actual number transferred is given in "n" ("n
ysr@777 223 // == 0" is deliberately redundant with the return value.) Locking impl:
ysr@777 224 // concurrency is allowed only with "par_push_arr" and/or "par_pop_arr"
ysr@777 225 // operations, which use the same locking strategy.
ysr@777 226 bool par_pop_arr(oop* ptr_arr, int max, int* n);
ysr@777 227
ysr@777 228 // Drain the mark stack, applying the given closure to all fields of
ysr@777 229 // objects on the stack. (That is, continue until the stack is empty,
ysr@777 230 // even if closure applications add entries to the stack.) The "bm"
ysr@777 231 // argument, if non-null, may be used to verify that only marked objects
ysr@777 232 // are on the mark stack. If "yield_after" is "true", then the
ysr@777 233 // concurrent marker performing the drain offers to yield after
ysr@777 234 // processing each object. If a yield occurs, stops the drain operation
ysr@777 235 // and returns false. Otherwise, returns true.
ysr@777 236 template<class OopClosureClass>
ysr@777 237 bool drain(OopClosureClass* cl, CMBitMap* bm, bool yield_after = false);
ysr@777 238
ysr@777 239 bool isEmpty() { return _index == 0; }
ysr@777 240 bool isFull() { return _index == _capacity; }
ysr@777 241 int maxElems() { return _capacity; }
ysr@777 242
ysr@777 243 bool overflow() { return _overflow; }
ysr@777 244 void clear_overflow() { _overflow = false; }
ysr@777 245
ysr@777 246 int size() { return _index; }
ysr@777 247
ysr@777 248 void setEmpty() { _index = 0; clear_overflow(); }
ysr@777 249
ysr@777 250 // Record the current size; a subsequent "oops_do" will iterate only over
ysr@777 251 // indices valid at the time of this call.
ysr@777 252 void set_oops_do_bound(jint bound = -1) {
ysr@777 253 if (bound == -1) {
ysr@777 254 _oops_do_bound = _index;
ysr@777 255 } else {
ysr@777 256 _oops_do_bound = bound;
ysr@777 257 }
ysr@777 258 }
ysr@777 259 jint oops_do_bound() { return _oops_do_bound; }
ysr@777 260 // iterate over the oops in the mark stack, up to the bound recorded via
ysr@777 261 // the call above.
ysr@777 262 void oops_do(OopClosure* f);
ysr@777 263 };
ysr@777 264
apetrusenko@984 265 class CMRegionStack VALUE_OBJ_CLASS_SPEC {
ysr@777 266 MemRegion* _base;
ysr@777 267 jint _capacity;
ysr@777 268 jint _index;
ysr@777 269 jint _oops_do_bound;
ysr@777 270 bool _overflow;
ysr@777 271 public:
ysr@777 272 CMRegionStack();
ysr@777 273 ~CMRegionStack();
ysr@777 274 void allocate(size_t size);
ysr@777 275
ysr@777 276 // This is lock-free; assumes that it will only be called in parallel
ysr@777 277 // with other "push" operations (no pops).
johnc@2190 278 void push_lock_free(MemRegion mr);
tonyp@1793 279
ysr@777 280 // Lock-free; assumes that it will only be called in parallel
ysr@777 281 // with other "pop" operations (no pushes).
johnc@2190 282 MemRegion pop_lock_free();
johnc@2190 283
johnc@2190 284 #if 0
johnc@2190 285 // The routines that manipulate the region stack with a lock are
johnc@2190 286 // not currently used. They should be retained, however, as a
johnc@2190 287 // diagnostic aid.
tonyp@1793 288
tonyp@1793 289 // These two are the implementations that use a lock. They can be
tonyp@1793 290 // called concurrently with each other but they should not be called
tonyp@1793 291 // concurrently with the lock-free versions (push() / pop()).
tonyp@1793 292 void push_with_lock(MemRegion mr);
tonyp@1793 293 MemRegion pop_with_lock();
johnc@2190 294 #endif
ysr@777 295
ysr@777 296 bool isEmpty() { return _index == 0; }
ysr@777 297 bool isFull() { return _index == _capacity; }
ysr@777 298
ysr@777 299 bool overflow() { return _overflow; }
ysr@777 300 void clear_overflow() { _overflow = false; }
ysr@777 301
ysr@777 302 int size() { return _index; }
ysr@777 303
ysr@777 304 // It iterates over the entries in the region stack and it
ysr@777 305 // invalidates (i.e. assigns MemRegion()) the ones that point to
ysr@777 306 // regions in the collection set.
ysr@777 307 bool invalidate_entries_into_cset();
ysr@777 308
ysr@777 309 // This gives an upper bound up to which the iteration in
ysr@777 310 // invalidate_entries_into_cset() will reach. This prevents
ysr@777 311 // newly-added entries to be unnecessarily scanned.
ysr@777 312 void set_oops_do_bound() {
ysr@777 313 _oops_do_bound = _index;
ysr@777 314 }
ysr@777 315
ysr@777 316 void setEmpty() { _index = 0; clear_overflow(); }
ysr@777 317 };
ysr@777 318
tonyp@2848 319 class ForceOverflowSettings VALUE_OBJ_CLASS_SPEC {
tonyp@2848 320 private:
tonyp@2848 321 #ifndef PRODUCT
tonyp@2848 322 uintx _num_remaining;
tonyp@2848 323 bool _force;
tonyp@2848 324 #endif // !defined(PRODUCT)
tonyp@2848 325
tonyp@2848 326 public:
tonyp@2848 327 void init() PRODUCT_RETURN;
tonyp@2848 328 void update() PRODUCT_RETURN;
tonyp@2848 329 bool should_force() PRODUCT_RETURN_( return false; );
tonyp@2848 330 };
tonyp@2848 331
ysr@777 332 // this will enable a variety of different statistics per GC task
ysr@777 333 #define _MARKING_STATS_ 0
ysr@777 334 // this will enable the higher verbose levels
ysr@777 335 #define _MARKING_VERBOSE_ 0
ysr@777 336
ysr@777 337 #if _MARKING_STATS_
ysr@777 338 #define statsOnly(statement) \
ysr@777 339 do { \
ysr@777 340 statement ; \
ysr@777 341 } while (0)
ysr@777 342 #else // _MARKING_STATS_
ysr@777 343 #define statsOnly(statement) \
ysr@777 344 do { \
ysr@777 345 } while (0)
ysr@777 346 #endif // _MARKING_STATS_
ysr@777 347
ysr@777 348 typedef enum {
ysr@777 349 no_verbose = 0, // verbose turned off
ysr@777 350 stats_verbose, // only prints stats at the end of marking
ysr@777 351 low_verbose, // low verbose, mostly per region and per major event
ysr@777 352 medium_verbose, // a bit more detailed than low
ysr@777 353 high_verbose // per object verbose
ysr@777 354 } CMVerboseLevel;
ysr@777 355
ysr@777 356
ysr@777 357 class ConcurrentMarkThread;
ysr@777 358
apetrusenko@984 359 class ConcurrentMark: public CHeapObj {
ysr@777 360 friend class ConcurrentMarkThread;
ysr@777 361 friend class CMTask;
ysr@777 362 friend class CMBitMapClosure;
johnc@3296 363 friend class CSetMarkOopClosure;
ysr@777 364 friend class CMGlobalObjectClosure;
ysr@777 365 friend class CMRemarkTask;
ysr@777 366 friend class CMConcurrentMarkingTask;
ysr@777 367 friend class G1ParNoteEndTask;
ysr@777 368 friend class CalcLiveObjectsClosure;
johnc@3175 369 friend class G1CMRefProcTaskProxy;
johnc@3175 370 friend class G1CMRefProcTaskExecutor;
johnc@2494 371 friend class G1CMParKeepAliveAndDrainClosure;
johnc@2494 372 friend class G1CMParDrainMarkingStackClosure;
ysr@777 373
ysr@777 374 protected:
ysr@777 375 ConcurrentMarkThread* _cmThread; // the thread doing the work
ysr@777 376 G1CollectedHeap* _g1h; // the heap.
ysr@777 377 size_t _parallel_marking_threads; // the number of marking
jmasa@3294 378 // threads we're use
jmasa@3294 379 size_t _max_parallel_marking_threads; // max number of marking
jmasa@3294 380 // threads we'll ever use
ysr@777 381 double _sleep_factor; // how much we have to sleep, with
ysr@777 382 // respect to the work we just did, to
ysr@777 383 // meet the marking overhead goal
ysr@777 384 double _marking_task_overhead; // marking target overhead for
ysr@777 385 // a single task
ysr@777 386
ysr@777 387 // same as the two above, but for the cleanup task
ysr@777 388 double _cleanup_sleep_factor;
ysr@777 389 double _cleanup_task_overhead;
ysr@777 390
tonyp@2472 391 FreeRegionList _cleanup_list;
ysr@777 392
ysr@777 393 // CMS marking support structures
ysr@777 394 CMBitMap _markBitMap1;
ysr@777 395 CMBitMap _markBitMap2;
ysr@777 396 CMBitMapRO* _prevMarkBitMap; // completed mark bitmap
ysr@777 397 CMBitMap* _nextMarkBitMap; // under-construction mark bitmap
ysr@777 398 bool _at_least_one_mark_complete;
ysr@777 399
ysr@777 400 BitMap _region_bm;
ysr@777 401 BitMap _card_bm;
ysr@777 402
ysr@777 403 // Heap bounds
ysr@777 404 HeapWord* _heap_start;
ysr@777 405 HeapWord* _heap_end;
ysr@777 406
ysr@777 407 // For gray objects
ysr@777 408 CMMarkStack _markStack; // Grey objects behind global finger.
ysr@777 409 CMRegionStack _regionStack; // Grey regions behind global finger.
ysr@777 410 HeapWord* volatile _finger; // the global finger, region aligned,
ysr@777 411 // always points to the end of the
ysr@777 412 // last claimed region
ysr@777 413
ysr@777 414 // marking tasks
ysr@777 415 size_t _max_task_num; // maximum task number
ysr@777 416 size_t _active_tasks; // task num currently active
ysr@777 417 CMTask** _tasks; // task queue array (max_task_num len)
ysr@777 418 CMTaskQueueSet* _task_queues; // task queue set
ysr@777 419 ParallelTaskTerminator _terminator; // for termination
ysr@777 420
ysr@777 421 // Two sync barriers that are used to synchronise tasks when an
ysr@777 422 // overflow occurs. The algorithm is the following. All tasks enter
ysr@777 423 // the first one to ensure that they have all stopped manipulating
ysr@777 424 // the global data structures. After they exit it, they re-initialise
ysr@777 425 // their data structures and task 0 re-initialises the global data
ysr@777 426 // structures. Then, they enter the second sync barrier. This
ysr@777 427 // ensure, that no task starts doing work before all data
ysr@777 428 // structures (local and global) have been re-initialised. When they
ysr@777 429 // exit it, they are free to start working again.
ysr@777 430 WorkGangBarrierSync _first_overflow_barrier_sync;
ysr@777 431 WorkGangBarrierSync _second_overflow_barrier_sync;
ysr@777 432
ysr@777 433
ysr@777 434 // this is set by any task, when an overflow on the global data
ysr@777 435 // structures is detected.
ysr@777 436 volatile bool _has_overflown;
ysr@777 437 // true: marking is concurrent, false: we're in remark
ysr@777 438 volatile bool _concurrent;
ysr@777 439 // set at the end of a Full GC so that marking aborts
ysr@777 440 volatile bool _has_aborted;
johnc@2190 441
ysr@777 442 // used when remark aborts due to an overflow to indicate that
ysr@777 443 // another concurrent marking phase should start
ysr@777 444 volatile bool _restart_for_overflow;
ysr@777 445
ysr@777 446 // This is true from the very start of concurrent marking until the
ysr@777 447 // point when all the tasks complete their work. It is really used
ysr@777 448 // to determine the points between the end of concurrent marking and
ysr@777 449 // time of remark.
ysr@777 450 volatile bool _concurrent_marking_in_progress;
ysr@777 451
ysr@777 452 // verbose level
ysr@777 453 CMVerboseLevel _verbose_level;
ysr@777 454
ysr@777 455 // These two fields are used to implement the optimisation that
ysr@777 456 // avoids pushing objects on the global/region stack if there are
ysr@777 457 // no collection set regions above the lowest finger.
ysr@777 458
ysr@777 459 // This is the lowest finger (among the global and local fingers),
ysr@777 460 // which is calculated before a new collection set is chosen.
ysr@777 461 HeapWord* _min_finger;
ysr@777 462 // If this flag is true, objects/regions that are marked below the
ysr@777 463 // finger should be pushed on the stack(s). If this is flag is
ysr@777 464 // false, it is safe not to push them on the stack(s).
ysr@777 465 bool _should_gray_objects;
ysr@777 466
ysr@777 467 // All of these times are in ms.
ysr@777 468 NumberSeq _init_times;
ysr@777 469 NumberSeq _remark_times;
ysr@777 470 NumberSeq _remark_mark_times;
ysr@777 471 NumberSeq _remark_weak_ref_times;
ysr@777 472 NumberSeq _cleanup_times;
ysr@777 473 double _total_counting_time;
ysr@777 474 double _total_rs_scrub_time;
ysr@777 475
ysr@777 476 double* _accum_task_vtime; // accumulated task vtime
ysr@777 477
jmasa@3294 478 FlexibleWorkGang* _parallel_workers;
ysr@777 479
tonyp@2848 480 ForceOverflowSettings _force_overflow_conc;
tonyp@2848 481 ForceOverflowSettings _force_overflow_stw;
tonyp@2848 482
ysr@777 483 void weakRefsWork(bool clear_all_soft_refs);
ysr@777 484
ysr@777 485 void swapMarkBitMaps();
ysr@777 486
ysr@777 487 // It resets the global marking data structures, as well as the
ysr@777 488 // task local ones; should be called during initial mark.
ysr@777 489 void reset();
ysr@777 490 // It resets all the marking data structures.
tonyp@2848 491 void clear_marking_state(bool clear_overflow = true);
ysr@777 492
ysr@777 493 // It should be called to indicate which phase we're in (concurrent
ysr@777 494 // mark or remark) and how many threads are currently active.
ysr@777 495 void set_phase(size_t active_tasks, bool concurrent);
ysr@777 496 // We do this after we're done with marking so that the marking data
ysr@777 497 // structures are initialised to a sensible and predictable state.
ysr@777 498 void set_non_marking_state();
ysr@777 499
ysr@777 500 // prints all gathered CM-related statistics
ysr@777 501 void print_stats();
ysr@777 502
tonyp@2472 503 bool cleanup_list_is_empty() {
tonyp@2472 504 return _cleanup_list.is_empty();
tonyp@2472 505 }
tonyp@2472 506
ysr@777 507 // accessor methods
ysr@777 508 size_t parallel_marking_threads() { return _parallel_marking_threads; }
jmasa@3294 509 size_t max_parallel_marking_threads() { return _max_parallel_marking_threads;}
ysr@777 510 double sleep_factor() { return _sleep_factor; }
ysr@777 511 double marking_task_overhead() { return _marking_task_overhead;}
ysr@777 512 double cleanup_sleep_factor() { return _cleanup_sleep_factor; }
ysr@777 513 double cleanup_task_overhead() { return _cleanup_task_overhead;}
ysr@777 514
ysr@777 515 HeapWord* finger() { return _finger; }
ysr@777 516 bool concurrent() { return _concurrent; }
ysr@777 517 size_t active_tasks() { return _active_tasks; }
ysr@777 518 ParallelTaskTerminator* terminator() { return &_terminator; }
ysr@777 519
ysr@777 520 // It claims the next available region to be scanned by a marking
ysr@777 521 // task. It might return NULL if the next region is empty or we have
ysr@777 522 // run out of regions. In the latter case, out_of_regions()
ysr@777 523 // determines whether we've really run out of regions or the task
ysr@777 524 // should call claim_region() again. This might seem a bit
ysr@777 525 // awkward. Originally, the code was written so that claim_region()
ysr@777 526 // either successfully returned with a non-empty region or there
ysr@777 527 // were no more regions to be claimed. The problem with this was
ysr@777 528 // that, in certain circumstances, it iterated over large chunks of
ysr@777 529 // the heap finding only empty regions and, while it was working, it
ysr@777 530 // was preventing the calling task to call its regular clock
ysr@777 531 // method. So, this way, each task will spend very little time in
ysr@777 532 // claim_region() and is allowed to call the regular clock method
ysr@777 533 // frequently.
ysr@777 534 HeapRegion* claim_region(int task);
ysr@777 535
ysr@777 536 // It determines whether we've run out of regions to scan.
ysr@777 537 bool out_of_regions() { return _finger == _heap_end; }
ysr@777 538
ysr@777 539 // Returns the task with the given id
ysr@777 540 CMTask* task(int id) {
tonyp@1458 541 assert(0 <= id && id < (int) _active_tasks,
tonyp@1458 542 "task id not within active bounds");
ysr@777 543 return _tasks[id];
ysr@777 544 }
ysr@777 545
ysr@777 546 // Returns the task queue with the given id
ysr@777 547 CMTaskQueue* task_queue(int id) {
tonyp@1458 548 assert(0 <= id && id < (int) _active_tasks,
tonyp@1458 549 "task queue id not within active bounds");
ysr@777 550 return (CMTaskQueue*) _task_queues->queue(id);
ysr@777 551 }
ysr@777 552
ysr@777 553 // Returns the task queue set
ysr@777 554 CMTaskQueueSet* task_queues() { return _task_queues; }
ysr@777 555
ysr@777 556 // Access / manipulation of the overflow flag which is set to
ysr@777 557 // indicate that the global stack or region stack has overflown
ysr@777 558 bool has_overflown() { return _has_overflown; }
ysr@777 559 void set_has_overflown() { _has_overflown = true; }
ysr@777 560 void clear_has_overflown() { _has_overflown = false; }
ysr@777 561
ysr@777 562 bool has_aborted() { return _has_aborted; }
ysr@777 563 bool restart_for_overflow() { return _restart_for_overflow; }
ysr@777 564
ysr@777 565 // Methods to enter the two overflow sync barriers
ysr@777 566 void enter_first_sync_barrier(int task_num);
ysr@777 567 void enter_second_sync_barrier(int task_num);
ysr@777 568
tonyp@2848 569 ForceOverflowSettings* force_overflow_conc() {
tonyp@2848 570 return &_force_overflow_conc;
tonyp@2848 571 }
tonyp@2848 572
tonyp@2848 573 ForceOverflowSettings* force_overflow_stw() {
tonyp@2848 574 return &_force_overflow_stw;
tonyp@2848 575 }
tonyp@2848 576
tonyp@2848 577 ForceOverflowSettings* force_overflow() {
tonyp@2848 578 if (concurrent()) {
tonyp@2848 579 return force_overflow_conc();
tonyp@2848 580 } else {
tonyp@2848 581 return force_overflow_stw();
tonyp@2848 582 }
tonyp@2848 583 }
tonyp@2848 584
ysr@777 585 public:
ysr@777 586 // Manipulation of the global mark stack.
ysr@777 587 // Notice that the first mark_stack_push is CAS-based, whereas the
ysr@777 588 // two below are Mutex-based. This is OK since the first one is only
ysr@777 589 // called during evacuation pauses and doesn't compete with the
ysr@777 590 // other two (which are called by the marking tasks during
ysr@777 591 // concurrent marking or remark).
ysr@777 592 bool mark_stack_push(oop p) {
ysr@777 593 _markStack.par_push(p);
ysr@777 594 if (_markStack.overflow()) {
ysr@777 595 set_has_overflown();
ysr@777 596 return false;
ysr@777 597 }
ysr@777 598 return true;
ysr@777 599 }
ysr@777 600 bool mark_stack_push(oop* arr, int n) {
ysr@777 601 _markStack.par_push_arr(arr, n);
ysr@777 602 if (_markStack.overflow()) {
ysr@777 603 set_has_overflown();
ysr@777 604 return false;
ysr@777 605 }
ysr@777 606 return true;
ysr@777 607 }
ysr@777 608 void mark_stack_pop(oop* arr, int max, int* n) {
ysr@777 609 _markStack.par_pop_arr(arr, max, n);
ysr@777 610 }
tonyp@2973 611 size_t mark_stack_size() { return _markStack.size(); }
ysr@777 612 size_t partial_mark_stack_size_target() { return _markStack.maxElems()/3; }
tonyp@2973 613 bool mark_stack_overflow() { return _markStack.overflow(); }
tonyp@2973 614 bool mark_stack_empty() { return _markStack.isEmpty(); }
ysr@777 615
johnc@2190 616 // (Lock-free) Manipulation of the region stack
johnc@2190 617 bool region_stack_push_lock_free(MemRegion mr) {
tonyp@1793 618 // Currently we only call the lock-free version during evacuation
tonyp@1793 619 // pauses.
tonyp@1793 620 assert(SafepointSynchronize::is_at_safepoint(), "world should be stopped");
tonyp@1793 621
johnc@2190 622 _regionStack.push_lock_free(mr);
ysr@777 623 if (_regionStack.overflow()) {
ysr@777 624 set_has_overflown();
ysr@777 625 return false;
ysr@777 626 }
ysr@777 627 return true;
ysr@777 628 }
johnc@2190 629
johnc@2190 630 // Lock-free version of region-stack pop. Should only be
johnc@2190 631 // called in tandem with other lock-free pops.
johnc@2190 632 MemRegion region_stack_pop_lock_free() {
johnc@2190 633 return _regionStack.pop_lock_free();
johnc@2190 634 }
johnc@2190 635
tonyp@1793 636 #if 0
johnc@2190 637 // The routines that manipulate the region stack with a lock are
johnc@2190 638 // not currently used. They should be retained, however, as a
johnc@2190 639 // diagnostic aid.
tonyp@1793 640
tonyp@1793 641 bool region_stack_push_with_lock(MemRegion mr) {
tonyp@1793 642 // Currently we only call the lock-based version during either
tonyp@1793 643 // concurrent marking or remark.
tonyp@1793 644 assert(!SafepointSynchronize::is_at_safepoint() || !concurrent(),
tonyp@1793 645 "if we are at a safepoint it should be the remark safepoint");
tonyp@1793 646
tonyp@1793 647 _regionStack.push_with_lock(mr);
tonyp@1793 648 if (_regionStack.overflow()) {
tonyp@1793 649 set_has_overflown();
tonyp@1793 650 return false;
tonyp@1793 651 }
tonyp@1793 652 return true;
tonyp@1793 653 }
johnc@2190 654
tonyp@1793 655 MemRegion region_stack_pop_with_lock() {
tonyp@1793 656 // Currently we only call the lock-based version during either
tonyp@1793 657 // concurrent marking or remark.
tonyp@1793 658 assert(!SafepointSynchronize::is_at_safepoint() || !concurrent(),
tonyp@1793 659 "if we are at a safepoint it should be the remark safepoint");
tonyp@1793 660
tonyp@1793 661 return _regionStack.pop_with_lock();
tonyp@1793 662 }
johnc@2190 663 #endif
tonyp@1793 664
ysr@777 665 int region_stack_size() { return _regionStack.size(); }
ysr@777 666 bool region_stack_overflow() { return _regionStack.overflow(); }
ysr@777 667 bool region_stack_empty() { return _regionStack.isEmpty(); }
ysr@777 668
johnc@2190 669 // Iterate over any regions that were aborted while draining the
johnc@2190 670 // region stack (any such regions are saved in the corresponding
johnc@2190 671 // CMTask) and invalidate (i.e. assign to the empty MemRegion())
johnc@2190 672 // any regions that point into the collection set.
johnc@2190 673 bool invalidate_aborted_regions_in_cset();
johnc@2190 674
johnc@2190 675 // Returns true if there are any aborted memory regions.
johnc@2190 676 bool has_aborted_regions();
johnc@2190 677
ysr@777 678 bool concurrent_marking_in_progress() {
ysr@777 679 return _concurrent_marking_in_progress;
ysr@777 680 }
ysr@777 681 void set_concurrent_marking_in_progress() {
ysr@777 682 _concurrent_marking_in_progress = true;
ysr@777 683 }
ysr@777 684 void clear_concurrent_marking_in_progress() {
ysr@777 685 _concurrent_marking_in_progress = false;
ysr@777 686 }
ysr@777 687
ysr@777 688 void update_accum_task_vtime(int i, double vtime) {
ysr@777 689 _accum_task_vtime[i] += vtime;
ysr@777 690 }
ysr@777 691
ysr@777 692 double all_task_accum_vtime() {
ysr@777 693 double ret = 0.0;
ysr@777 694 for (int i = 0; i < (int)_max_task_num; ++i)
ysr@777 695 ret += _accum_task_vtime[i];
ysr@777 696 return ret;
ysr@777 697 }
ysr@777 698
ysr@777 699 // Attempts to steal an object from the task queues of other tasks
ysr@777 700 bool try_stealing(int task_num, int* hash_seed, oop& obj) {
ysr@777 701 return _task_queues->steal(task_num, hash_seed, obj);
ysr@777 702 }
ysr@777 703
ysr@777 704 // It grays an object by first marking it. Then, if it's behind the
ysr@777 705 // global finger, it also pushes it on the global stack.
ysr@777 706 void deal_with_reference(oop obj);
ysr@777 707
ysr@777 708 ConcurrentMark(ReservedSpace rs, int max_regions);
ysr@777 709 ~ConcurrentMark();
ysr@777 710 ConcurrentMarkThread* cmThread() { return _cmThread; }
ysr@777 711
ysr@777 712 CMBitMapRO* prevMarkBitMap() const { return _prevMarkBitMap; }
ysr@777 713 CMBitMap* nextMarkBitMap() const { return _nextMarkBitMap; }
ysr@777 714
jmasa@3294 715 // Returns the number of GC threads to be used in a concurrent
jmasa@3294 716 // phase based on the number of GC threads being used in a STW
jmasa@3294 717 // phase.
jmasa@3294 718 size_t scale_parallel_threads(size_t n_par_threads);
jmasa@3294 719
jmasa@3294 720 // Calculates the number of GC threads to be used in a concurrent phase.
jmasa@3294 721 int calc_parallel_marking_threads();
jmasa@3294 722
ysr@777 723 // The following three are interaction between CM and
ysr@777 724 // G1CollectedHeap
ysr@777 725
ysr@777 726 // This notifies CM that a root during initial-mark needs to be
ysr@777 727 // grayed and it's MT-safe. Currently, we just mark it. But, in the
ysr@777 728 // future, we can experiment with pushing it on the stack and we can
ysr@777 729 // do this without changing G1CollectedHeap.
ysr@777 730 void grayRoot(oop p);
ysr@777 731 // It's used during evacuation pauses to gray a region, if
ysr@777 732 // necessary, and it's MT-safe. It assumes that the caller has
ysr@777 733 // marked any objects on that region. If _should_gray_objects is
ysr@777 734 // true and we're still doing concurrent marking, the region is
ysr@777 735 // pushed on the region stack, if it is located below the global
ysr@777 736 // finger, otherwise we do nothing.
ysr@777 737 void grayRegionIfNecessary(MemRegion mr);
ysr@777 738 // It's used during evacuation pauses to mark and, if necessary,
ysr@777 739 // gray a single object and it's MT-safe. It assumes the caller did
ysr@777 740 // not mark the object. If _should_gray_objects is true and we're
ysr@777 741 // still doing concurrent marking, the objects is pushed on the
ysr@777 742 // global stack, if it is located below the global finger, otherwise
ysr@777 743 // we do nothing.
ysr@777 744 void markAndGrayObjectIfNecessary(oop p);
ysr@777 745
tonyp@1823 746 // It iterates over the heap and for each object it comes across it
tonyp@1823 747 // will dump the contents of its reference fields, as well as
tonyp@1823 748 // liveness information for the object and its referents. The dump
tonyp@1823 749 // will be written to a file with the following name:
johnc@2969 750 // G1PrintReachableBaseFile + "." + str.
johnc@2969 751 // vo decides whether the prev (vo == UsePrevMarking), the next
johnc@2969 752 // (vo == UseNextMarking) marking information, or the mark word
johnc@2969 753 // (vo == UseMarkWord) will be used to determine the liveness of
johnc@2969 754 // each object / referent.
johnc@2969 755 // If all is true, all objects in the heap will be dumped, otherwise
johnc@2969 756 // only the live ones. In the dump the following symbols / breviations
johnc@2969 757 // are used:
tonyp@1823 758 // M : an explicitly live object (its bitmap bit is set)
tonyp@1823 759 // > : an implicitly live object (over tams)
tonyp@1823 760 // O : an object outside the G1 heap (typically: in the perm gen)
tonyp@1823 761 // NOT : a reference field whose referent is not live
tonyp@1823 762 // AND MARKED : indicates that an object is both explicitly and
tonyp@1823 763 // implicitly live (it should be one or the other, not both)
tonyp@1823 764 void print_reachable(const char* str,
johnc@2969 765 VerifyOption vo, bool all) PRODUCT_RETURN;
ysr@777 766
ysr@777 767 // Clear the next marking bitmap (will be called concurrently).
ysr@777 768 void clearNextBitmap();
ysr@777 769
ysr@777 770 // These two do the work that needs to be done before and after the
ysr@777 771 // initial root checkpoint. Since this checkpoint can be done at two
ysr@777 772 // different points (i.e. an explicit pause or piggy-backed on a
ysr@777 773 // young collection), then it's nice to be able to easily share the
ysr@777 774 // pre/post code. It might be the case that we can put everything in
ysr@777 775 // the post method. TP
ysr@777 776 void checkpointRootsInitialPre();
ysr@777 777 void checkpointRootsInitialPost();
ysr@777 778
ysr@777 779 // Do concurrent phase of marking, to a tentative transitive closure.
ysr@777 780 void markFromRoots();
ysr@777 781
ysr@777 782 // Process all unprocessed SATB buffers. It is called at the
ysr@777 783 // beginning of an evacuation pause.
ysr@777 784 void drainAllSATBBuffers();
ysr@777 785
ysr@777 786 void checkpointRootsFinal(bool clear_all_soft_refs);
ysr@777 787 void checkpointRootsFinalWork();
ysr@777 788 void calcDesiredRegions();
ysr@777 789 void cleanup();
ysr@777 790 void completeCleanup();
ysr@777 791
ysr@777 792 // Mark in the previous bitmap. NB: this is usually read-only, so use
ysr@777 793 // this carefully!
ysr@777 794 void markPrev(oop p);
ysr@777 795 void clear(oop p);
ysr@777 796 // Clears marks for all objects in the given range, for both prev and
ysr@777 797 // next bitmaps. NB: the previous bitmap is usually read-only, so use
ysr@777 798 // this carefully!
ysr@777 799 void clearRangeBothMaps(MemRegion mr);
ysr@777 800
ysr@777 801 // Record the current top of the mark and region stacks; a
ysr@777 802 // subsequent oops_do() on the mark stack and
ysr@777 803 // invalidate_entries_into_cset() on the region stack will iterate
ysr@777 804 // only over indices valid at the time of this call.
ysr@777 805 void set_oops_do_bound() {
ysr@777 806 _markStack.set_oops_do_bound();
ysr@777 807 _regionStack.set_oops_do_bound();
ysr@777 808 }
ysr@777 809 // Iterate over the oops in the mark stack and all local queues. It
ysr@777 810 // also calls invalidate_entries_into_cset() on the region stack.
ysr@777 811 void oops_do(OopClosure* f);
ysr@777 812 // It is called at the end of an evacuation pause during marking so
ysr@777 813 // that CM is notified of where the new end of the heap is. It
ysr@777 814 // doesn't do anything if concurrent_marking_in_progress() is false,
ysr@777 815 // unless the force parameter is true.
ysr@777 816 void update_g1_committed(bool force = false);
ysr@777 817
ysr@777 818 void complete_marking_in_collection_set();
ysr@777 819
ysr@777 820 // It indicates that a new collection set is being chosen.
ysr@777 821 void newCSet();
johnc@2910 822
ysr@777 823 // It registers a collection set heap region with CM. This is used
ysr@777 824 // to determine whether any heap regions are located above the finger.
ysr@777 825 void registerCSetRegion(HeapRegion* hr);
ysr@777 826
johnc@2910 827 // Resets the region fields of any active CMTask whose region fields
johnc@2910 828 // are in the collection set (i.e. the region currently claimed by
johnc@2910 829 // the CMTask will be evacuated and may be used, subsequently, as
johnc@2910 830 // an alloc region). When this happens the region fields in the CMTask
johnc@2910 831 // are stale and, hence, should be cleared causing the worker thread
johnc@2910 832 // to claim a new region.
johnc@2910 833 void reset_active_task_region_fields_in_cset();
johnc@2910 834
johnc@1829 835 // Registers the maximum region-end associated with a set of
johnc@1829 836 // regions with CM. Again this is used to determine whether any
johnc@1829 837 // heap regions are located above the finger.
johnc@1829 838 void register_collection_set_finger(HeapWord* max_finger) {
johnc@1829 839 // max_finger is the highest heap region end of the regions currently
johnc@1829 840 // contained in the collection set. If this value is larger than
johnc@1829 841 // _min_finger then we need to gray objects.
johnc@1829 842 // This routine is like registerCSetRegion but for an entire
johnc@1829 843 // collection of regions.
tonyp@2973 844 if (max_finger > _min_finger) {
johnc@1829 845 _should_gray_objects = true;
tonyp@2973 846 }
johnc@1829 847 }
johnc@1829 848
ysr@777 849 // Returns "true" if at least one mark has been completed.
ysr@777 850 bool at_least_one_mark_complete() { return _at_least_one_mark_complete; }
ysr@777 851
ysr@777 852 bool isMarked(oop p) const {
ysr@777 853 assert(p != NULL && p->is_oop(), "expected an oop");
ysr@777 854 HeapWord* addr = (HeapWord*)p;
ysr@777 855 assert(addr >= _nextMarkBitMap->startWord() ||
ysr@777 856 addr < _nextMarkBitMap->endWord(), "in a region");
ysr@777 857
ysr@777 858 return _nextMarkBitMap->isMarked(addr);
ysr@777 859 }
ysr@777 860
ysr@777 861 inline bool not_yet_marked(oop p) const;
ysr@777 862
ysr@777 863 // XXX Debug code
ysr@777 864 bool containing_card_is_marked(void* p);
ysr@777 865 bool containing_cards_are_marked(void* start, void* last);
ysr@777 866
ysr@777 867 bool isPrevMarked(oop p) const {
ysr@777 868 assert(p != NULL && p->is_oop(), "expected an oop");
ysr@777 869 HeapWord* addr = (HeapWord*)p;
ysr@777 870 assert(addr >= _prevMarkBitMap->startWord() ||
ysr@777 871 addr < _prevMarkBitMap->endWord(), "in a region");
ysr@777 872
ysr@777 873 return _prevMarkBitMap->isMarked(addr);
ysr@777 874 }
ysr@777 875
ysr@777 876 inline bool do_yield_check(int worker_i = 0);
ysr@777 877 inline bool should_yield();
ysr@777 878
ysr@777 879 // Called to abort the marking cycle after a Full GC takes palce.
ysr@777 880 void abort();
ysr@777 881
ysr@777 882 // This prints the global/local fingers. It is used for debugging.
ysr@777 883 NOT_PRODUCT(void print_finger();)
ysr@777 884
ysr@777 885 void print_summary_info();
ysr@777 886
tonyp@1454 887 void print_worker_threads_on(outputStream* st) const;
tonyp@1454 888
ysr@777 889 // The following indicate whether a given verbose level has been
ysr@777 890 // set. Notice that anything above stats is conditional to
ysr@777 891 // _MARKING_VERBOSE_ having been set to 1
tonyp@2973 892 bool verbose_stats() {
tonyp@2973 893 return _verbose_level >= stats_verbose;
tonyp@2973 894 }
tonyp@2973 895 bool verbose_low() {
tonyp@2973 896 return _MARKING_VERBOSE_ && _verbose_level >= low_verbose;
tonyp@2973 897 }
tonyp@2973 898 bool verbose_medium() {
tonyp@2973 899 return _MARKING_VERBOSE_ && _verbose_level >= medium_verbose;
tonyp@2973 900 }
tonyp@2973 901 bool verbose_high() {
tonyp@2973 902 return _MARKING_VERBOSE_ && _verbose_level >= high_verbose;
tonyp@2973 903 }
ysr@777 904 };
ysr@777 905
ysr@777 906 // A class representing a marking task.
ysr@777 907 class CMTask : public TerminatorTerminator {
ysr@777 908 private:
ysr@777 909 enum PrivateConstants {
ysr@777 910 // the regular clock call is called once the scanned words reaches
ysr@777 911 // this limit
ysr@777 912 words_scanned_period = 12*1024,
ysr@777 913 // the regular clock call is called once the number of visited
ysr@777 914 // references reaches this limit
ysr@777 915 refs_reached_period = 384,
ysr@777 916 // initial value for the hash seed, used in the work stealing code
ysr@777 917 init_hash_seed = 17,
ysr@777 918 // how many entries will be transferred between global stack and
ysr@777 919 // local queues
ysr@777 920 global_stack_transfer_size = 16
ysr@777 921 };
ysr@777 922
ysr@777 923 int _task_id;
ysr@777 924 G1CollectedHeap* _g1h;
ysr@777 925 ConcurrentMark* _cm;
ysr@777 926 CMBitMap* _nextMarkBitMap;
ysr@777 927 // the task queue of this task
ysr@777 928 CMTaskQueue* _task_queue;
ysr@1280 929 private:
ysr@777 930 // the task queue set---needed for stealing
ysr@777 931 CMTaskQueueSet* _task_queues;
ysr@777 932 // indicates whether the task has been claimed---this is only for
ysr@777 933 // debugging purposes
ysr@777 934 bool _claimed;
ysr@777 935
ysr@777 936 // number of calls to this task
ysr@777 937 int _calls;
ysr@777 938
ysr@777 939 // when the virtual timer reaches this time, the marking step should
ysr@777 940 // exit
ysr@777 941 double _time_target_ms;
ysr@777 942 // the start time of the current marking step
ysr@777 943 double _start_time_ms;
ysr@777 944
ysr@777 945 // the oop closure used for iterations over oops
tonyp@2968 946 G1CMOopClosure* _cm_oop_closure;
ysr@777 947
ysr@777 948 // the region this task is scanning, NULL if we're not scanning any
ysr@777 949 HeapRegion* _curr_region;
ysr@777 950 // the local finger of this task, NULL if we're not scanning a region
ysr@777 951 HeapWord* _finger;
ysr@777 952 // limit of the region this task is scanning, NULL if we're not scanning one
ysr@777 953 HeapWord* _region_limit;
ysr@777 954
ysr@777 955 // This is used only when we scan regions popped from the region
ysr@777 956 // stack. It records what the last object on such a region we
ysr@777 957 // scanned was. It is used to ensure that, if we abort region
ysr@777 958 // iteration, we do not rescan the first part of the region. This
ysr@777 959 // should be NULL when we're not scanning a region from the region
ysr@777 960 // stack.
ysr@777 961 HeapWord* _region_finger;
ysr@777 962
johnc@2190 963 // If we abort while scanning a region we record the remaining
johnc@2190 964 // unscanned portion and check this field when marking restarts.
johnc@2190 965 // This avoids having to push on the region stack while other
johnc@2190 966 // marking threads may still be popping regions.
johnc@2190 967 // If we were to push the unscanned portion directly to the
johnc@2190 968 // region stack then we would need to using locking versions
johnc@2190 969 // of the push and pop operations.
johnc@2190 970 MemRegion _aborted_region;
johnc@2190 971
ysr@777 972 // the number of words this task has scanned
ysr@777 973 size_t _words_scanned;
ysr@777 974 // When _words_scanned reaches this limit, the regular clock is
ysr@777 975 // called. Notice that this might be decreased under certain
ysr@777 976 // circumstances (i.e. when we believe that we did an expensive
ysr@777 977 // operation).
ysr@777 978 size_t _words_scanned_limit;
ysr@777 979 // the initial value of _words_scanned_limit (i.e. what it was
ysr@777 980 // before it was decreased).
ysr@777 981 size_t _real_words_scanned_limit;
ysr@777 982
ysr@777 983 // the number of references this task has visited
ysr@777 984 size_t _refs_reached;
ysr@777 985 // When _refs_reached reaches this limit, the regular clock is
ysr@777 986 // called. Notice this this might be decreased under certain
ysr@777 987 // circumstances (i.e. when we believe that we did an expensive
ysr@777 988 // operation).
ysr@777 989 size_t _refs_reached_limit;
ysr@777 990 // the initial value of _refs_reached_limit (i.e. what it was before
ysr@777 991 // it was decreased).
ysr@777 992 size_t _real_refs_reached_limit;
ysr@777 993
ysr@777 994 // used by the work stealing stuff
ysr@777 995 int _hash_seed;
ysr@777 996 // if this is true, then the task has aborted for some reason
ysr@777 997 bool _has_aborted;
ysr@777 998 // set when the task aborts because it has met its time quota
johnc@2494 999 bool _has_timed_out;
ysr@777 1000 // true when we're draining SATB buffers; this avoids the task
ysr@777 1001 // aborting due to SATB buffers being available (as we're already
ysr@777 1002 // dealing with them)
ysr@777 1003 bool _draining_satb_buffers;
ysr@777 1004
ysr@777 1005 // number sequence of past step times
ysr@777 1006 NumberSeq _step_times_ms;
ysr@777 1007 // elapsed time of this task
ysr@777 1008 double _elapsed_time_ms;
ysr@777 1009 // termination time of this task
ysr@777 1010 double _termination_time_ms;
ysr@777 1011 // when this task got into the termination protocol
ysr@777 1012 double _termination_start_time_ms;
ysr@777 1013
ysr@777 1014 // true when the task is during a concurrent phase, false when it is
ysr@777 1015 // in the remark phase (so, in the latter case, we do not have to
ysr@777 1016 // check all the things that we have to check during the concurrent
ysr@777 1017 // phase, i.e. SATB buffer availability...)
ysr@777 1018 bool _concurrent;
ysr@777 1019
ysr@777 1020 TruncatedSeq _marking_step_diffs_ms;
ysr@777 1021
ysr@777 1022 // LOTS of statistics related with this task
ysr@777 1023 #if _MARKING_STATS_
ysr@777 1024 NumberSeq _all_clock_intervals_ms;
ysr@777 1025 double _interval_start_time_ms;
ysr@777 1026
ysr@777 1027 int _aborted;
ysr@777 1028 int _aborted_overflow;
ysr@777 1029 int _aborted_cm_aborted;
ysr@777 1030 int _aborted_yield;
ysr@777 1031 int _aborted_timed_out;
ysr@777 1032 int _aborted_satb;
ysr@777 1033 int _aborted_termination;
ysr@777 1034
ysr@777 1035 int _steal_attempts;
ysr@777 1036 int _steals;
ysr@777 1037
ysr@777 1038 int _clock_due_to_marking;
ysr@777 1039 int _clock_due_to_scanning;
ysr@777 1040
ysr@777 1041 int _local_pushes;
ysr@777 1042 int _local_pops;
ysr@777 1043 int _local_max_size;
ysr@777 1044 int _objs_scanned;
ysr@777 1045
ysr@777 1046 int _global_pushes;
ysr@777 1047 int _global_pops;
ysr@777 1048 int _global_max_size;
ysr@777 1049
ysr@777 1050 int _global_transfers_to;
ysr@777 1051 int _global_transfers_from;
ysr@777 1052
ysr@777 1053 int _region_stack_pops;
ysr@777 1054
ysr@777 1055 int _regions_claimed;
ysr@777 1056 int _objs_found_on_bitmap;
ysr@777 1057
ysr@777 1058 int _satb_buffers_processed;
ysr@777 1059 #endif // _MARKING_STATS_
ysr@777 1060
ysr@777 1061 // it updates the local fields after this task has claimed
ysr@777 1062 // a new region to scan
ysr@777 1063 void setup_for_region(HeapRegion* hr);
ysr@777 1064 // it brings up-to-date the limit of the region
ysr@777 1065 void update_region_limit();
ysr@777 1066
ysr@777 1067 // called when either the words scanned or the refs visited limit
ysr@777 1068 // has been reached
ysr@777 1069 void reached_limit();
ysr@777 1070 // recalculates the words scanned and refs visited limits
ysr@777 1071 void recalculate_limits();
ysr@777 1072 // decreases the words scanned and refs visited limits when we reach
ysr@777 1073 // an expensive operation
ysr@777 1074 void decrease_limits();
ysr@777 1075 // it checks whether the words scanned or refs visited reached their
ysr@777 1076 // respective limit and calls reached_limit() if they have
ysr@777 1077 void check_limits() {
ysr@777 1078 if (_words_scanned >= _words_scanned_limit ||
tonyp@2973 1079 _refs_reached >= _refs_reached_limit) {
ysr@777 1080 reached_limit();
tonyp@2973 1081 }
ysr@777 1082 }
ysr@777 1083 // this is supposed to be called regularly during a marking step as
ysr@777 1084 // it checks a bunch of conditions that might cause the marking step
ysr@777 1085 // to abort
ysr@777 1086 void regular_clock_call();
ysr@777 1087 bool concurrent() { return _concurrent; }
ysr@777 1088
ysr@777 1089 public:
ysr@777 1090 // It resets the task; it should be called right at the beginning of
ysr@777 1091 // a marking phase.
ysr@777 1092 void reset(CMBitMap* _nextMarkBitMap);
ysr@777 1093 // it clears all the fields that correspond to a claimed region.
ysr@777 1094 void clear_region_fields();
ysr@777 1095
ysr@777 1096 void set_concurrent(bool concurrent) { _concurrent = concurrent; }
ysr@777 1097
ysr@777 1098 // The main method of this class which performs a marking step
ysr@777 1099 // trying not to exceed the given duration. However, it might exit
ysr@777 1100 // prematurely, according to some conditions (i.e. SATB buffers are
ysr@777 1101 // available for processing).
johnc@2494 1102 void do_marking_step(double target_ms, bool do_stealing, bool do_termination);
ysr@777 1103
ysr@777 1104 // These two calls start and stop the timer
ysr@777 1105 void record_start_time() {
ysr@777 1106 _elapsed_time_ms = os::elapsedTime() * 1000.0;
ysr@777 1107 }
ysr@777 1108 void record_end_time() {
ysr@777 1109 _elapsed_time_ms = os::elapsedTime() * 1000.0 - _elapsed_time_ms;
ysr@777 1110 }
ysr@777 1111
ysr@777 1112 // returns the task ID
ysr@777 1113 int task_id() { return _task_id; }
ysr@777 1114
ysr@777 1115 // From TerminatorTerminator. It determines whether this task should
ysr@777 1116 // exit the termination protocol after it's entered it.
ysr@777 1117 virtual bool should_exit_termination();
ysr@777 1118
johnc@2910 1119 // Resets the local region fields after a task has finished scanning a
johnc@2910 1120 // region; or when they have become stale as a result of the region
johnc@2910 1121 // being evacuated.
johnc@2910 1122 void giveup_current_region();
johnc@2910 1123
ysr@777 1124 HeapWord* finger() { return _finger; }
ysr@777 1125
ysr@777 1126 bool has_aborted() { return _has_aborted; }
ysr@777 1127 void set_has_aborted() { _has_aborted = true; }
ysr@777 1128 void clear_has_aborted() { _has_aborted = false; }
johnc@2494 1129 bool has_timed_out() { return _has_timed_out; }
johnc@2494 1130 bool claimed() { return _claimed; }
ysr@777 1131
johnc@2190 1132 // Support routines for the partially scanned region that may be
johnc@2190 1133 // recorded as a result of aborting while draining the CMRegionStack
johnc@2190 1134 MemRegion aborted_region() { return _aborted_region; }
johnc@2190 1135 void set_aborted_region(MemRegion mr)
johnc@2190 1136 { _aborted_region = mr; }
johnc@2190 1137
johnc@2190 1138 // Clears any recorded partially scanned region
johnc@2190 1139 void clear_aborted_region() { set_aborted_region(MemRegion()); }
johnc@2190 1140
tonyp@2968 1141 void set_cm_oop_closure(G1CMOopClosure* cm_oop_closure);
ysr@777 1142
ysr@777 1143 // It grays the object by marking it and, if necessary, pushing it
ysr@777 1144 // on the local queue
tonyp@2968 1145 inline void deal_with_reference(oop obj);
ysr@777 1146
ysr@777 1147 // It scans an object and visits its children.
tonyp@2968 1148 void scan_object(oop obj);
ysr@777 1149
ysr@777 1150 // It pushes an object on the local queue.
tonyp@2968 1151 inline void push(oop obj);
ysr@777 1152
ysr@777 1153 // These two move entries to/from the global stack.
ysr@777 1154 void move_entries_to_global_stack();
ysr@777 1155 void get_entries_from_global_stack();
ysr@777 1156
ysr@777 1157 // It pops and scans objects from the local queue. If partially is
ysr@777 1158 // true, then it stops when the queue size is of a given limit. If
ysr@777 1159 // partially is false, then it stops when the queue is empty.
ysr@777 1160 void drain_local_queue(bool partially);
ysr@777 1161 // It moves entries from the global stack to the local queue and
ysr@777 1162 // drains the local queue. If partially is true, then it stops when
ysr@777 1163 // both the global stack and the local queue reach a given size. If
ysr@777 1164 // partially if false, it tries to empty them totally.
ysr@777 1165 void drain_global_stack(bool partially);
ysr@777 1166 // It keeps picking SATB buffers and processing them until no SATB
ysr@777 1167 // buffers are available.
ysr@777 1168 void drain_satb_buffers();
ysr@777 1169 // It keeps popping regions from the region stack and processing
ysr@777 1170 // them until the region stack is empty.
ysr@777 1171 void drain_region_stack(BitMapClosure* closure);
ysr@777 1172
ysr@777 1173 // moves the local finger to a new location
ysr@777 1174 inline void move_finger_to(HeapWord* new_finger) {
tonyp@1458 1175 assert(new_finger >= _finger && new_finger < _region_limit, "invariant");
ysr@777 1176 _finger = new_finger;
ysr@777 1177 }
ysr@777 1178
ysr@777 1179 // moves the region finger to a new location
ysr@777 1180 inline void move_region_finger_to(HeapWord* new_finger) {
tonyp@1458 1181 assert(new_finger < _cm->finger(), "invariant");
ysr@777 1182 _region_finger = new_finger;
ysr@777 1183 }
ysr@777 1184
ysr@777 1185 CMTask(int task_num, ConcurrentMark *cm,
ysr@777 1186 CMTaskQueue* task_queue, CMTaskQueueSet* task_queues);
ysr@777 1187
ysr@777 1188 // it prints statistics associated with this task
ysr@777 1189 void print_stats();
ysr@777 1190
ysr@777 1191 #if _MARKING_STATS_
ysr@777 1192 void increase_objs_found_on_bitmap() { ++_objs_found_on_bitmap; }
ysr@777 1193 #endif // _MARKING_STATS_
ysr@777 1194 };
stefank@2314 1195
tonyp@2717 1196 // Class that's used to to print out per-region liveness
tonyp@2717 1197 // information. It's currently used at the end of marking and also
tonyp@2717 1198 // after we sort the old regions at the end of the cleanup operation.
tonyp@2717 1199 class G1PrintRegionLivenessInfoClosure: public HeapRegionClosure {
tonyp@2717 1200 private:
tonyp@2717 1201 outputStream* _out;
tonyp@2717 1202
tonyp@2717 1203 // Accumulators for these values.
tonyp@2717 1204 size_t _total_used_bytes;
tonyp@2717 1205 size_t _total_capacity_bytes;
tonyp@2717 1206 size_t _total_prev_live_bytes;
tonyp@2717 1207 size_t _total_next_live_bytes;
tonyp@2717 1208
tonyp@2717 1209 // These are set up when we come across a "stars humongous" region
tonyp@2717 1210 // (as this is where most of this information is stored, not in the
tonyp@2717 1211 // subsequent "continues humongous" regions). After that, for every
tonyp@2717 1212 // region in a given humongous region series we deduce the right
tonyp@2717 1213 // values for it by simply subtracting the appropriate amount from
tonyp@2717 1214 // these fields. All these values should reach 0 after we've visited
tonyp@2717 1215 // the last region in the series.
tonyp@2717 1216 size_t _hum_used_bytes;
tonyp@2717 1217 size_t _hum_capacity_bytes;
tonyp@2717 1218 size_t _hum_prev_live_bytes;
tonyp@2717 1219 size_t _hum_next_live_bytes;
tonyp@2717 1220
tonyp@2717 1221 static double perc(size_t val, size_t total) {
tonyp@2717 1222 if (total == 0) {
tonyp@2717 1223 return 0.0;
tonyp@2717 1224 } else {
tonyp@2717 1225 return 100.0 * ((double) val / (double) total);
tonyp@2717 1226 }
tonyp@2717 1227 }
tonyp@2717 1228
tonyp@2717 1229 static double bytes_to_mb(size_t val) {
tonyp@2717 1230 return (double) val / (double) M;
tonyp@2717 1231 }
tonyp@2717 1232
tonyp@2717 1233 // See the .cpp file.
tonyp@2717 1234 size_t get_hum_bytes(size_t* hum_bytes);
tonyp@2717 1235 void get_hum_bytes(size_t* used_bytes, size_t* capacity_bytes,
tonyp@2717 1236 size_t* prev_live_bytes, size_t* next_live_bytes);
tonyp@2717 1237
tonyp@2717 1238 public:
tonyp@2717 1239 // The header and footer are printed in the constructor and
tonyp@2717 1240 // destructor respectively.
tonyp@2717 1241 G1PrintRegionLivenessInfoClosure(outputStream* out, const char* phase_name);
tonyp@2717 1242 virtual bool doHeapRegion(HeapRegion* r);
tonyp@2717 1243 ~G1PrintRegionLivenessInfoClosure();
tonyp@2717 1244 };
tonyp@2717 1245
stefank@2314 1246 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_CONCURRENTMARK_HPP

mercurial