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

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

author
johnc
date
Mon, 03 Aug 2009 12:59:30 -0700
changeset 1324
15c5903cf9e1
parent 1280
df6caf649ff7
child 1371
e1fdf4fd34dc
permissions
-rw-r--r--

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

ysr@777 1 /*
xdono@1014 2 * Copyright 2001-2009 Sun Microsystems, Inc. All Rights Reserved.
ysr@777 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
ysr@777 4 *
ysr@777 5 * This code is free software; you can redistribute it and/or modify it
ysr@777 6 * under the terms of the GNU General Public License version 2 only, as
ysr@777 7 * published by the Free Software Foundation.
ysr@777 8 *
ysr@777 9 * This code is distributed in the hope that it will be useful, but WITHOUT
ysr@777 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
ysr@777 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
ysr@777 12 * version 2 for more details (a copy is included in the LICENSE file that
ysr@777 13 * accompanied this code).
ysr@777 14 *
ysr@777 15 * You should have received a copy of the GNU General Public License version
ysr@777 16 * 2 along with this work; if not, write to the Free Software Foundation,
ysr@777 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
ysr@777 18 *
ysr@777 19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
ysr@777 20 * CA 95054 USA or visit www.sun.com if you need additional information or
ysr@777 21 * have any questions.
ysr@777 22 *
ysr@777 23 */
ysr@777 24
ysr@777 25 class G1CollectedHeap;
ysr@777 26 class CMTask;
ysr@777 27 typedef GenericTaskQueue<oop> CMTaskQueue;
ysr@777 28 typedef GenericTaskQueueSet<oop> CMTaskQueueSet;
ysr@777 29
ysr@777 30 // A generic CM bit map. This is essentially a wrapper around the BitMap
ysr@777 31 // class, with one bit per (1<<_shifter) HeapWords.
ysr@777 32
apetrusenko@984 33 class CMBitMapRO VALUE_OBJ_CLASS_SPEC {
ysr@777 34 protected:
ysr@777 35 HeapWord* _bmStartWord; // base address of range covered by map
ysr@777 36 size_t _bmWordSize; // map size (in #HeapWords covered)
ysr@777 37 const int _shifter; // map to char or bit
ysr@777 38 VirtualSpace _virtual_space; // underlying the bit map
ysr@777 39 BitMap _bm; // the bit map itself
ysr@777 40
ysr@777 41 public:
ysr@777 42 // constructor
ysr@777 43 CMBitMapRO(ReservedSpace rs, int shifter);
ysr@777 44
ysr@777 45 enum { do_yield = true };
ysr@777 46
ysr@777 47 // inquiries
ysr@777 48 HeapWord* startWord() const { return _bmStartWord; }
ysr@777 49 size_t sizeInWords() const { return _bmWordSize; }
ysr@777 50 // the following is one past the last word in space
ysr@777 51 HeapWord* endWord() const { return _bmStartWord + _bmWordSize; }
ysr@777 52
ysr@777 53 // read marks
ysr@777 54
ysr@777 55 bool isMarked(HeapWord* addr) const {
ysr@777 56 assert(_bmStartWord <= addr && addr < (_bmStartWord + _bmWordSize),
ysr@777 57 "outside underlying space?");
ysr@777 58 return _bm.at(heapWordToOffset(addr));
ysr@777 59 }
ysr@777 60
ysr@777 61 // iteration
ysr@777 62 bool iterate(BitMapClosure* cl) { return _bm.iterate(cl); }
ysr@777 63 bool iterate(BitMapClosure* cl, MemRegion mr);
ysr@777 64
ysr@777 65 // Return the address corresponding to the next marked bit at or after
ysr@777 66 // "addr", and before "limit", if "limit" is non-NULL. If there is no
ysr@777 67 // such bit, returns "limit" if that is non-NULL, or else "endWord()".
ysr@777 68 HeapWord* getNextMarkedWordAddress(HeapWord* addr,
ysr@777 69 HeapWord* limit = NULL) const;
ysr@777 70 // Return the address corresponding to the next unmarked bit at or after
ysr@777 71 // "addr", and before "limit", if "limit" is non-NULL. If there is no
ysr@777 72 // such bit, returns "limit" if that is non-NULL, or else "endWord()".
ysr@777 73 HeapWord* getNextUnmarkedWordAddress(HeapWord* addr,
ysr@777 74 HeapWord* limit = NULL) const;
ysr@777 75
ysr@777 76 // conversion utilities
ysr@777 77 // XXX Fix these so that offsets are size_t's...
ysr@777 78 HeapWord* offsetToHeapWord(size_t offset) const {
ysr@777 79 return _bmStartWord + (offset << _shifter);
ysr@777 80 }
ysr@777 81 size_t heapWordToOffset(HeapWord* addr) const {
ysr@777 82 return pointer_delta(addr, _bmStartWord) >> _shifter;
ysr@777 83 }
ysr@777 84 int heapWordDiffToOffsetDiff(size_t diff) const;
ysr@777 85 HeapWord* nextWord(HeapWord* addr) {
ysr@777 86 return offsetToHeapWord(heapWordToOffset(addr) + 1);
ysr@777 87 }
ysr@777 88
ysr@777 89 void mostly_disjoint_range_union(BitMap* from_bitmap,
ysr@777 90 size_t from_start_index,
ysr@777 91 HeapWord* to_start_word,
ysr@777 92 size_t word_num);
ysr@777 93
ysr@777 94 // debugging
ysr@777 95 NOT_PRODUCT(bool covers(ReservedSpace rs) const;)
ysr@777 96 };
ysr@777 97
ysr@777 98 class CMBitMap : public CMBitMapRO {
ysr@777 99
ysr@777 100 public:
ysr@777 101 // constructor
ysr@777 102 CMBitMap(ReservedSpace rs, int shifter) :
ysr@777 103 CMBitMapRO(rs, shifter) {}
ysr@777 104
ysr@777 105 // write marks
ysr@777 106 void mark(HeapWord* addr) {
ysr@777 107 assert(_bmStartWord <= addr && addr < (_bmStartWord + _bmWordSize),
ysr@777 108 "outside underlying space?");
ysr@777 109 _bm.at_put(heapWordToOffset(addr), true);
ysr@777 110 }
ysr@777 111 void clear(HeapWord* addr) {
ysr@777 112 assert(_bmStartWord <= addr && addr < (_bmStartWord + _bmWordSize),
ysr@777 113 "outside underlying space?");
ysr@777 114 _bm.at_put(heapWordToOffset(addr), false);
ysr@777 115 }
ysr@777 116 bool parMark(HeapWord* addr) {
ysr@777 117 assert(_bmStartWord <= addr && addr < (_bmStartWord + _bmWordSize),
ysr@777 118 "outside underlying space?");
ysr@777 119 return _bm.par_at_put(heapWordToOffset(addr), true);
ysr@777 120 }
ysr@777 121 bool parClear(HeapWord* addr) {
ysr@777 122 assert(_bmStartWord <= addr && addr < (_bmStartWord + _bmWordSize),
ysr@777 123 "outside underlying space?");
ysr@777 124 return _bm.par_at_put(heapWordToOffset(addr), false);
ysr@777 125 }
ysr@777 126 void markRange(MemRegion mr);
ysr@777 127 void clearAll();
ysr@777 128 void clearRange(MemRegion mr);
ysr@777 129
ysr@777 130 // Starting at the bit corresponding to "addr" (inclusive), find the next
ysr@777 131 // "1" bit, if any. This bit starts some run of consecutive "1"'s; find
ysr@777 132 // the end of this run (stopping at "end_addr"). Return the MemRegion
ysr@777 133 // covering from the start of the region corresponding to the first bit
ysr@777 134 // of the run to the end of the region corresponding to the last bit of
ysr@777 135 // the run. If there is no "1" bit at or after "addr", return an empty
ysr@777 136 // MemRegion.
ysr@777 137 MemRegion getAndClearMarkedRegion(HeapWord* addr, HeapWord* end_addr);
ysr@777 138 };
ysr@777 139
ysr@777 140 // Represents a marking stack used by the CM collector.
ysr@777 141 // Ideally this should be GrowableArray<> just like MSC's marking stack(s).
apetrusenko@984 142 class CMMarkStack VALUE_OBJ_CLASS_SPEC {
ysr@777 143 ConcurrentMark* _cm;
ysr@777 144 oop* _base; // bottom of stack
ysr@777 145 jint _index; // one more than last occupied index
ysr@777 146 jint _capacity; // max #elements
ysr@777 147 jint _oops_do_bound; // Number of elements to include in next iteration.
ysr@777 148 NOT_PRODUCT(jint _max_depth;) // max depth plumbed during run
ysr@777 149
ysr@777 150 bool _overflow;
ysr@777 151 DEBUG_ONLY(bool _drain_in_progress;)
ysr@777 152 DEBUG_ONLY(bool _drain_in_progress_yields;)
ysr@777 153
ysr@777 154 public:
ysr@777 155 CMMarkStack(ConcurrentMark* cm);
ysr@777 156 ~CMMarkStack();
ysr@777 157
ysr@777 158 void allocate(size_t size);
ysr@777 159
ysr@777 160 oop pop() {
ysr@777 161 if (!isEmpty()) {
ysr@777 162 return _base[--_index] ;
ysr@777 163 }
ysr@777 164 return NULL;
ysr@777 165 }
ysr@777 166
ysr@777 167 // If overflow happens, don't do the push, and record the overflow.
ysr@777 168 // *Requires* that "ptr" is already marked.
ysr@777 169 void push(oop ptr) {
ysr@777 170 if (isFull()) {
ysr@777 171 // Record overflow.
ysr@777 172 _overflow = true;
ysr@777 173 return;
ysr@777 174 } else {
ysr@777 175 _base[_index++] = ptr;
ysr@777 176 NOT_PRODUCT(_max_depth = MAX2(_max_depth, _index));
ysr@777 177 }
ysr@777 178 }
ysr@777 179 // Non-block impl. Note: concurrency is allowed only with other
ysr@777 180 // "par_push" operations, not with "pop" or "drain". We would need
ysr@777 181 // parallel versions of them if such concurrency was desired.
ysr@777 182 void par_push(oop ptr);
ysr@777 183
ysr@777 184 // Pushes the first "n" elements of "ptr_arr" on the stack.
ysr@777 185 // Non-block impl. Note: concurrency is allowed only with other
ysr@777 186 // "par_adjoin_arr" or "push" operations, not with "pop" or "drain".
ysr@777 187 void par_adjoin_arr(oop* ptr_arr, int n);
ysr@777 188
ysr@777 189 // Pushes the first "n" elements of "ptr_arr" on the stack.
ysr@777 190 // Locking impl: concurrency is allowed only with
ysr@777 191 // "par_push_arr" and/or "par_pop_arr" operations, which use the same
ysr@777 192 // locking strategy.
ysr@777 193 void par_push_arr(oop* ptr_arr, int n);
ysr@777 194
ysr@777 195 // If returns false, the array was empty. Otherwise, removes up to "max"
ysr@777 196 // elements from the stack, and transfers them to "ptr_arr" in an
ysr@777 197 // unspecified order. The actual number transferred is given in "n" ("n
ysr@777 198 // == 0" is deliberately redundant with the return value.) Locking impl:
ysr@777 199 // concurrency is allowed only with "par_push_arr" and/or "par_pop_arr"
ysr@777 200 // operations, which use the same locking strategy.
ysr@777 201 bool par_pop_arr(oop* ptr_arr, int max, int* n);
ysr@777 202
ysr@777 203 // Drain the mark stack, applying the given closure to all fields of
ysr@777 204 // objects on the stack. (That is, continue until the stack is empty,
ysr@777 205 // even if closure applications add entries to the stack.) The "bm"
ysr@777 206 // argument, if non-null, may be used to verify that only marked objects
ysr@777 207 // are on the mark stack. If "yield_after" is "true", then the
ysr@777 208 // concurrent marker performing the drain offers to yield after
ysr@777 209 // processing each object. If a yield occurs, stops the drain operation
ysr@777 210 // and returns false. Otherwise, returns true.
ysr@777 211 template<class OopClosureClass>
ysr@777 212 bool drain(OopClosureClass* cl, CMBitMap* bm, bool yield_after = false);
ysr@777 213
ysr@777 214 bool isEmpty() { return _index == 0; }
ysr@777 215 bool isFull() { return _index == _capacity; }
ysr@777 216 int maxElems() { return _capacity; }
ysr@777 217
ysr@777 218 bool overflow() { return _overflow; }
ysr@777 219 void clear_overflow() { _overflow = false; }
ysr@777 220
ysr@777 221 int size() { return _index; }
ysr@777 222
ysr@777 223 void setEmpty() { _index = 0; clear_overflow(); }
ysr@777 224
ysr@777 225 // Record the current size; a subsequent "oops_do" will iterate only over
ysr@777 226 // indices valid at the time of this call.
ysr@777 227 void set_oops_do_bound(jint bound = -1) {
ysr@777 228 if (bound == -1) {
ysr@777 229 _oops_do_bound = _index;
ysr@777 230 } else {
ysr@777 231 _oops_do_bound = bound;
ysr@777 232 }
ysr@777 233 }
ysr@777 234 jint oops_do_bound() { return _oops_do_bound; }
ysr@777 235 // iterate over the oops in the mark stack, up to the bound recorded via
ysr@777 236 // the call above.
ysr@777 237 void oops_do(OopClosure* f);
ysr@777 238 };
ysr@777 239
apetrusenko@984 240 class CMRegionStack VALUE_OBJ_CLASS_SPEC {
ysr@777 241 MemRegion* _base;
ysr@777 242 jint _capacity;
ysr@777 243 jint _index;
ysr@777 244 jint _oops_do_bound;
ysr@777 245 bool _overflow;
ysr@777 246 public:
ysr@777 247 CMRegionStack();
ysr@777 248 ~CMRegionStack();
ysr@777 249 void allocate(size_t size);
ysr@777 250
ysr@777 251 // This is lock-free; assumes that it will only be called in parallel
ysr@777 252 // with other "push" operations (no pops).
ysr@777 253 void push(MemRegion mr);
ysr@777 254
ysr@777 255 // Lock-free; assumes that it will only be called in parallel
ysr@777 256 // with other "pop" operations (no pushes).
ysr@777 257 MemRegion pop();
ysr@777 258
ysr@777 259 bool isEmpty() { return _index == 0; }
ysr@777 260 bool isFull() { return _index == _capacity; }
ysr@777 261
ysr@777 262 bool overflow() { return _overflow; }
ysr@777 263 void clear_overflow() { _overflow = false; }
ysr@777 264
ysr@777 265 int size() { return _index; }
ysr@777 266
ysr@777 267 // It iterates over the entries in the region stack and it
ysr@777 268 // invalidates (i.e. assigns MemRegion()) the ones that point to
ysr@777 269 // regions in the collection set.
ysr@777 270 bool invalidate_entries_into_cset();
ysr@777 271
ysr@777 272 // This gives an upper bound up to which the iteration in
ysr@777 273 // invalidate_entries_into_cset() will reach. This prevents
ysr@777 274 // newly-added entries to be unnecessarily scanned.
ysr@777 275 void set_oops_do_bound() {
ysr@777 276 _oops_do_bound = _index;
ysr@777 277 }
ysr@777 278
ysr@777 279 void setEmpty() { _index = 0; clear_overflow(); }
ysr@777 280 };
ysr@777 281
ysr@777 282 // this will enable a variety of different statistics per GC task
ysr@777 283 #define _MARKING_STATS_ 0
ysr@777 284 // this will enable the higher verbose levels
ysr@777 285 #define _MARKING_VERBOSE_ 0
ysr@777 286
ysr@777 287 #if _MARKING_STATS_
ysr@777 288 #define statsOnly(statement) \
ysr@777 289 do { \
ysr@777 290 statement ; \
ysr@777 291 } while (0)
ysr@777 292 #else // _MARKING_STATS_
ysr@777 293 #define statsOnly(statement) \
ysr@777 294 do { \
ysr@777 295 } while (0)
ysr@777 296 #endif // _MARKING_STATS_
ysr@777 297
ysr@777 298 // Some extra guarantees that I like to also enable in optimised mode
ysr@777 299 // when debugging. If you want to enable them, comment out the assert
ysr@777 300 // macro and uncomment out the guaratee macro
ysr@777 301 // #define tmp_guarantee_CM(expr, str) guarantee(expr, str)
ysr@777 302 #define tmp_guarantee_CM(expr, str) assert(expr, str)
ysr@777 303
ysr@777 304 typedef enum {
ysr@777 305 no_verbose = 0, // verbose turned off
ysr@777 306 stats_verbose, // only prints stats at the end of marking
ysr@777 307 low_verbose, // low verbose, mostly per region and per major event
ysr@777 308 medium_verbose, // a bit more detailed than low
ysr@777 309 high_verbose // per object verbose
ysr@777 310 } CMVerboseLevel;
ysr@777 311
ysr@777 312
ysr@777 313 class ConcurrentMarkThread;
ysr@777 314
apetrusenko@984 315 class ConcurrentMark: public CHeapObj {
ysr@777 316 friend class ConcurrentMarkThread;
ysr@777 317 friend class CMTask;
ysr@777 318 friend class CMBitMapClosure;
ysr@777 319 friend class CSMarkOopClosure;
ysr@777 320 friend class CMGlobalObjectClosure;
ysr@777 321 friend class CMRemarkTask;
ysr@777 322 friend class CMConcurrentMarkingTask;
ysr@777 323 friend class G1ParNoteEndTask;
ysr@777 324 friend class CalcLiveObjectsClosure;
ysr@777 325
ysr@777 326 protected:
ysr@777 327 ConcurrentMarkThread* _cmThread; // the thread doing the work
ysr@777 328 G1CollectedHeap* _g1h; // the heap.
ysr@777 329 size_t _parallel_marking_threads; // the number of marking
ysr@777 330 // threads we'll use
ysr@777 331 double _sleep_factor; // how much we have to sleep, with
ysr@777 332 // respect to the work we just did, to
ysr@777 333 // meet the marking overhead goal
ysr@777 334 double _marking_task_overhead; // marking target overhead for
ysr@777 335 // a single task
ysr@777 336
ysr@777 337 // same as the two above, but for the cleanup task
ysr@777 338 double _cleanup_sleep_factor;
ysr@777 339 double _cleanup_task_overhead;
ysr@777 340
ysr@777 341 // Stuff related to age cohort processing.
ysr@777 342 struct ParCleanupThreadState {
ysr@777 343 char _pre[64];
ysr@777 344 UncleanRegionList list;
ysr@777 345 char _post[64];
ysr@777 346 };
ysr@777 347 ParCleanupThreadState** _par_cleanup_thread_state;
ysr@777 348
ysr@777 349 // CMS marking support structures
ysr@777 350 CMBitMap _markBitMap1;
ysr@777 351 CMBitMap _markBitMap2;
ysr@777 352 CMBitMapRO* _prevMarkBitMap; // completed mark bitmap
ysr@777 353 CMBitMap* _nextMarkBitMap; // under-construction mark bitmap
ysr@777 354 bool _at_least_one_mark_complete;
ysr@777 355
ysr@777 356 BitMap _region_bm;
ysr@777 357 BitMap _card_bm;
ysr@777 358
ysr@777 359 // Heap bounds
ysr@777 360 HeapWord* _heap_start;
ysr@777 361 HeapWord* _heap_end;
ysr@777 362
ysr@777 363 // For gray objects
ysr@777 364 CMMarkStack _markStack; // Grey objects behind global finger.
ysr@777 365 CMRegionStack _regionStack; // Grey regions behind global finger.
ysr@777 366 HeapWord* volatile _finger; // the global finger, region aligned,
ysr@777 367 // always points to the end of the
ysr@777 368 // last claimed region
ysr@777 369
ysr@777 370 // marking tasks
ysr@777 371 size_t _max_task_num; // maximum task number
ysr@777 372 size_t _active_tasks; // task num currently active
ysr@777 373 CMTask** _tasks; // task queue array (max_task_num len)
ysr@777 374 CMTaskQueueSet* _task_queues; // task queue set
ysr@777 375 ParallelTaskTerminator _terminator; // for termination
ysr@777 376
ysr@777 377 // Two sync barriers that are used to synchronise tasks when an
ysr@777 378 // overflow occurs. The algorithm is the following. All tasks enter
ysr@777 379 // the first one to ensure that they have all stopped manipulating
ysr@777 380 // the global data structures. After they exit it, they re-initialise
ysr@777 381 // their data structures and task 0 re-initialises the global data
ysr@777 382 // structures. Then, they enter the second sync barrier. This
ysr@777 383 // ensure, that no task starts doing work before all data
ysr@777 384 // structures (local and global) have been re-initialised. When they
ysr@777 385 // exit it, they are free to start working again.
ysr@777 386 WorkGangBarrierSync _first_overflow_barrier_sync;
ysr@777 387 WorkGangBarrierSync _second_overflow_barrier_sync;
ysr@777 388
ysr@777 389
ysr@777 390 // this is set by any task, when an overflow on the global data
ysr@777 391 // structures is detected.
ysr@777 392 volatile bool _has_overflown;
ysr@777 393 // true: marking is concurrent, false: we're in remark
ysr@777 394 volatile bool _concurrent;
ysr@777 395 // set at the end of a Full GC so that marking aborts
ysr@777 396 volatile bool _has_aborted;
ysr@777 397 // used when remark aborts due to an overflow to indicate that
ysr@777 398 // another concurrent marking phase should start
ysr@777 399 volatile bool _restart_for_overflow;
ysr@777 400
ysr@777 401 // This is true from the very start of concurrent marking until the
ysr@777 402 // point when all the tasks complete their work. It is really used
ysr@777 403 // to determine the points between the end of concurrent marking and
ysr@777 404 // time of remark.
ysr@777 405 volatile bool _concurrent_marking_in_progress;
ysr@777 406
ysr@777 407 // verbose level
ysr@777 408 CMVerboseLevel _verbose_level;
ysr@777 409
ysr@777 410 COTracker _cleanup_co_tracker;
ysr@777 411
ysr@777 412 // These two fields are used to implement the optimisation that
ysr@777 413 // avoids pushing objects on the global/region stack if there are
ysr@777 414 // no collection set regions above the lowest finger.
ysr@777 415
ysr@777 416 // This is the lowest finger (among the global and local fingers),
ysr@777 417 // which is calculated before a new collection set is chosen.
ysr@777 418 HeapWord* _min_finger;
ysr@777 419 // If this flag is true, objects/regions that are marked below the
ysr@777 420 // finger should be pushed on the stack(s). If this is flag is
ysr@777 421 // false, it is safe not to push them on the stack(s).
ysr@777 422 bool _should_gray_objects;
ysr@777 423
ysr@777 424 // All of these times are in ms.
ysr@777 425 NumberSeq _init_times;
ysr@777 426 NumberSeq _remark_times;
ysr@777 427 NumberSeq _remark_mark_times;
ysr@777 428 NumberSeq _remark_weak_ref_times;
ysr@777 429 NumberSeq _cleanup_times;
ysr@777 430 double _total_counting_time;
ysr@777 431 double _total_rs_scrub_time;
ysr@777 432
ysr@777 433 double* _accum_task_vtime; // accumulated task vtime
ysr@777 434
ysr@777 435 WorkGang* _parallel_workers;
ysr@777 436
ysr@777 437 void weakRefsWork(bool clear_all_soft_refs);
ysr@777 438
ysr@777 439 void swapMarkBitMaps();
ysr@777 440
ysr@777 441 // It resets the global marking data structures, as well as the
ysr@777 442 // task local ones; should be called during initial mark.
ysr@777 443 void reset();
ysr@777 444 // It resets all the marking data structures.
ysr@777 445 void clear_marking_state();
ysr@777 446
ysr@777 447 // It should be called to indicate which phase we're in (concurrent
ysr@777 448 // mark or remark) and how many threads are currently active.
ysr@777 449 void set_phase(size_t active_tasks, bool concurrent);
ysr@777 450 // We do this after we're done with marking so that the marking data
ysr@777 451 // structures are initialised to a sensible and predictable state.
ysr@777 452 void set_non_marking_state();
ysr@777 453
ysr@777 454 // prints all gathered CM-related statistics
ysr@777 455 void print_stats();
ysr@777 456
ysr@777 457 // accessor methods
ysr@777 458 size_t parallel_marking_threads() { return _parallel_marking_threads; }
ysr@777 459 double sleep_factor() { return _sleep_factor; }
ysr@777 460 double marking_task_overhead() { return _marking_task_overhead;}
ysr@777 461 double cleanup_sleep_factor() { return _cleanup_sleep_factor; }
ysr@777 462 double cleanup_task_overhead() { return _cleanup_task_overhead;}
ysr@777 463
ysr@777 464 HeapWord* finger() { return _finger; }
ysr@777 465 bool concurrent() { return _concurrent; }
ysr@777 466 size_t active_tasks() { return _active_tasks; }
ysr@777 467 ParallelTaskTerminator* terminator() { return &_terminator; }
ysr@777 468
ysr@777 469 // It claims the next available region to be scanned by a marking
ysr@777 470 // task. It might return NULL if the next region is empty or we have
ysr@777 471 // run out of regions. In the latter case, out_of_regions()
ysr@777 472 // determines whether we've really run out of regions or the task
ysr@777 473 // should call claim_region() again. This might seem a bit
ysr@777 474 // awkward. Originally, the code was written so that claim_region()
ysr@777 475 // either successfully returned with a non-empty region or there
ysr@777 476 // were no more regions to be claimed. The problem with this was
ysr@777 477 // that, in certain circumstances, it iterated over large chunks of
ysr@777 478 // the heap finding only empty regions and, while it was working, it
ysr@777 479 // was preventing the calling task to call its regular clock
ysr@777 480 // method. So, this way, each task will spend very little time in
ysr@777 481 // claim_region() and is allowed to call the regular clock method
ysr@777 482 // frequently.
ysr@777 483 HeapRegion* claim_region(int task);
ysr@777 484
ysr@777 485 // It determines whether we've run out of regions to scan.
ysr@777 486 bool out_of_regions() { return _finger == _heap_end; }
ysr@777 487
ysr@777 488 // Returns the task with the given id
ysr@777 489 CMTask* task(int id) {
ysr@777 490 guarantee( 0 <= id && id < (int) _active_tasks, "task id not within "
ysr@777 491 "active bounds" );
ysr@777 492 return _tasks[id];
ysr@777 493 }
ysr@777 494
ysr@777 495 // Returns the task queue with the given id
ysr@777 496 CMTaskQueue* task_queue(int id) {
ysr@777 497 guarantee( 0 <= id && id < (int) _active_tasks, "task queue id not within "
ysr@777 498 "active bounds" );
ysr@777 499 return (CMTaskQueue*) _task_queues->queue(id);
ysr@777 500 }
ysr@777 501
ysr@777 502 // Returns the task queue set
ysr@777 503 CMTaskQueueSet* task_queues() { return _task_queues; }
ysr@777 504
ysr@777 505 // Access / manipulation of the overflow flag which is set to
ysr@777 506 // indicate that the global stack or region stack has overflown
ysr@777 507 bool has_overflown() { return _has_overflown; }
ysr@777 508 void set_has_overflown() { _has_overflown = true; }
ysr@777 509 void clear_has_overflown() { _has_overflown = false; }
ysr@777 510
ysr@777 511 bool has_aborted() { return _has_aborted; }
ysr@777 512 bool restart_for_overflow() { return _restart_for_overflow; }
ysr@777 513
ysr@777 514 // Methods to enter the two overflow sync barriers
ysr@777 515 void enter_first_sync_barrier(int task_num);
ysr@777 516 void enter_second_sync_barrier(int task_num);
ysr@777 517
ysr@777 518 public:
ysr@777 519 // Manipulation of the global mark stack.
ysr@777 520 // Notice that the first mark_stack_push is CAS-based, whereas the
ysr@777 521 // two below are Mutex-based. This is OK since the first one is only
ysr@777 522 // called during evacuation pauses and doesn't compete with the
ysr@777 523 // other two (which are called by the marking tasks during
ysr@777 524 // concurrent marking or remark).
ysr@777 525 bool mark_stack_push(oop p) {
ysr@777 526 _markStack.par_push(p);
ysr@777 527 if (_markStack.overflow()) {
ysr@777 528 set_has_overflown();
ysr@777 529 return false;
ysr@777 530 }
ysr@777 531 return true;
ysr@777 532 }
ysr@777 533 bool mark_stack_push(oop* arr, int n) {
ysr@777 534 _markStack.par_push_arr(arr, n);
ysr@777 535 if (_markStack.overflow()) {
ysr@777 536 set_has_overflown();
ysr@777 537 return false;
ysr@777 538 }
ysr@777 539 return true;
ysr@777 540 }
ysr@777 541 void mark_stack_pop(oop* arr, int max, int* n) {
ysr@777 542 _markStack.par_pop_arr(arr, max, n);
ysr@777 543 }
ysr@777 544 size_t mark_stack_size() { return _markStack.size(); }
ysr@777 545 size_t partial_mark_stack_size_target() { return _markStack.maxElems()/3; }
ysr@777 546 bool mark_stack_overflow() { return _markStack.overflow(); }
ysr@777 547 bool mark_stack_empty() { return _markStack.isEmpty(); }
ysr@777 548
ysr@777 549 // Manipulation of the region stack
ysr@777 550 bool region_stack_push(MemRegion mr) {
ysr@777 551 _regionStack.push(mr);
ysr@777 552 if (_regionStack.overflow()) {
ysr@777 553 set_has_overflown();
ysr@777 554 return false;
ysr@777 555 }
ysr@777 556 return true;
ysr@777 557 }
ysr@777 558 MemRegion region_stack_pop() { return _regionStack.pop(); }
ysr@777 559 int region_stack_size() { return _regionStack.size(); }
ysr@777 560 bool region_stack_overflow() { return _regionStack.overflow(); }
ysr@777 561 bool region_stack_empty() { return _regionStack.isEmpty(); }
ysr@777 562
ysr@777 563 bool concurrent_marking_in_progress() {
ysr@777 564 return _concurrent_marking_in_progress;
ysr@777 565 }
ysr@777 566 void set_concurrent_marking_in_progress() {
ysr@777 567 _concurrent_marking_in_progress = true;
ysr@777 568 }
ysr@777 569 void clear_concurrent_marking_in_progress() {
ysr@777 570 _concurrent_marking_in_progress = false;
ysr@777 571 }
ysr@777 572
ysr@777 573 void update_accum_task_vtime(int i, double vtime) {
ysr@777 574 _accum_task_vtime[i] += vtime;
ysr@777 575 }
ysr@777 576
ysr@777 577 double all_task_accum_vtime() {
ysr@777 578 double ret = 0.0;
ysr@777 579 for (int i = 0; i < (int)_max_task_num; ++i)
ysr@777 580 ret += _accum_task_vtime[i];
ysr@777 581 return ret;
ysr@777 582 }
ysr@777 583
ysr@777 584 // Attempts to steal an object from the task queues of other tasks
ysr@777 585 bool try_stealing(int task_num, int* hash_seed, oop& obj) {
ysr@777 586 return _task_queues->steal(task_num, hash_seed, obj);
ysr@777 587 }
ysr@777 588
ysr@777 589 // It grays an object by first marking it. Then, if it's behind the
ysr@777 590 // global finger, it also pushes it on the global stack.
ysr@777 591 void deal_with_reference(oop obj);
ysr@777 592
ysr@777 593 ConcurrentMark(ReservedSpace rs, int max_regions);
ysr@777 594 ~ConcurrentMark();
ysr@777 595 ConcurrentMarkThread* cmThread() { return _cmThread; }
ysr@777 596
ysr@777 597 CMBitMapRO* prevMarkBitMap() const { return _prevMarkBitMap; }
ysr@777 598 CMBitMap* nextMarkBitMap() const { return _nextMarkBitMap; }
ysr@777 599
ysr@777 600 // The following three are interaction between CM and
ysr@777 601 // G1CollectedHeap
ysr@777 602
ysr@777 603 // This notifies CM that a root during initial-mark needs to be
ysr@777 604 // grayed and it's MT-safe. Currently, we just mark it. But, in the
ysr@777 605 // future, we can experiment with pushing it on the stack and we can
ysr@777 606 // do this without changing G1CollectedHeap.
ysr@777 607 void grayRoot(oop p);
ysr@777 608 // It's used during evacuation pauses to gray a region, if
ysr@777 609 // necessary, and it's MT-safe. It assumes that the caller has
ysr@777 610 // marked any objects on that region. If _should_gray_objects is
ysr@777 611 // true and we're still doing concurrent marking, the region is
ysr@777 612 // pushed on the region stack, if it is located below the global
ysr@777 613 // finger, otherwise we do nothing.
ysr@777 614 void grayRegionIfNecessary(MemRegion mr);
ysr@777 615 // It's used during evacuation pauses to mark and, if necessary,
ysr@777 616 // gray a single object and it's MT-safe. It assumes the caller did
ysr@777 617 // not mark the object. If _should_gray_objects is true and we're
ysr@777 618 // still doing concurrent marking, the objects is pushed on the
ysr@777 619 // global stack, if it is located below the global finger, otherwise
ysr@777 620 // we do nothing.
ysr@777 621 void markAndGrayObjectIfNecessary(oop p);
ysr@777 622
ysr@777 623 // This iterates over the bitmap of the previous marking and prints
ysr@777 624 // out all objects that are marked on the bitmap and indicates
ysr@777 625 // whether what they point to is also marked or not.
ysr@777 626 void print_prev_bitmap_reachable();
ysr@777 627
ysr@777 628 // Clear the next marking bitmap (will be called concurrently).
ysr@777 629 void clearNextBitmap();
ysr@777 630
ysr@777 631 // main CMS steps and related support
ysr@777 632 void checkpointRootsInitial();
ysr@777 633
ysr@777 634 // These two do the work that needs to be done before and after the
ysr@777 635 // initial root checkpoint. Since this checkpoint can be done at two
ysr@777 636 // different points (i.e. an explicit pause or piggy-backed on a
ysr@777 637 // young collection), then it's nice to be able to easily share the
ysr@777 638 // pre/post code. It might be the case that we can put everything in
ysr@777 639 // the post method. TP
ysr@777 640 void checkpointRootsInitialPre();
ysr@777 641 void checkpointRootsInitialPost();
ysr@777 642
ysr@777 643 // Do concurrent phase of marking, to a tentative transitive closure.
ysr@777 644 void markFromRoots();
ysr@777 645
ysr@777 646 // Process all unprocessed SATB buffers. It is called at the
ysr@777 647 // beginning of an evacuation pause.
ysr@777 648 void drainAllSATBBuffers();
ysr@777 649
ysr@777 650 void checkpointRootsFinal(bool clear_all_soft_refs);
ysr@777 651 void checkpointRootsFinalWork();
ysr@777 652 void calcDesiredRegions();
ysr@777 653 void cleanup();
ysr@777 654 void completeCleanup();
ysr@777 655
ysr@777 656 // Mark in the previous bitmap. NB: this is usually read-only, so use
ysr@777 657 // this carefully!
ysr@777 658 void markPrev(oop p);
ysr@777 659 void clear(oop p);
ysr@777 660 // Clears marks for all objects in the given range, for both prev and
ysr@777 661 // next bitmaps. NB: the previous bitmap is usually read-only, so use
ysr@777 662 // this carefully!
ysr@777 663 void clearRangeBothMaps(MemRegion mr);
ysr@777 664
ysr@777 665 // Record the current top of the mark and region stacks; a
ysr@777 666 // subsequent oops_do() on the mark stack and
ysr@777 667 // invalidate_entries_into_cset() on the region stack will iterate
ysr@777 668 // only over indices valid at the time of this call.
ysr@777 669 void set_oops_do_bound() {
ysr@777 670 _markStack.set_oops_do_bound();
ysr@777 671 _regionStack.set_oops_do_bound();
ysr@777 672 }
ysr@777 673 // Iterate over the oops in the mark stack and all local queues. It
ysr@777 674 // also calls invalidate_entries_into_cset() on the region stack.
ysr@777 675 void oops_do(OopClosure* f);
ysr@777 676 // It is called at the end of an evacuation pause during marking so
ysr@777 677 // that CM is notified of where the new end of the heap is. It
ysr@777 678 // doesn't do anything if concurrent_marking_in_progress() is false,
ysr@777 679 // unless the force parameter is true.
ysr@777 680 void update_g1_committed(bool force = false);
ysr@777 681
ysr@777 682 void complete_marking_in_collection_set();
ysr@777 683
ysr@777 684 // It indicates that a new collection set is being chosen.
ysr@777 685 void newCSet();
ysr@777 686 // It registers a collection set heap region with CM. This is used
ysr@777 687 // to determine whether any heap regions are located above the finger.
ysr@777 688 void registerCSetRegion(HeapRegion* hr);
ysr@777 689
ysr@777 690 // Returns "true" if at least one mark has been completed.
ysr@777 691 bool at_least_one_mark_complete() { return _at_least_one_mark_complete; }
ysr@777 692
ysr@777 693 bool isMarked(oop p) const {
ysr@777 694 assert(p != NULL && p->is_oop(), "expected an oop");
ysr@777 695 HeapWord* addr = (HeapWord*)p;
ysr@777 696 assert(addr >= _nextMarkBitMap->startWord() ||
ysr@777 697 addr < _nextMarkBitMap->endWord(), "in a region");
ysr@777 698
ysr@777 699 return _nextMarkBitMap->isMarked(addr);
ysr@777 700 }
ysr@777 701
ysr@777 702 inline bool not_yet_marked(oop p) const;
ysr@777 703
ysr@777 704 // XXX Debug code
ysr@777 705 bool containing_card_is_marked(void* p);
ysr@777 706 bool containing_cards_are_marked(void* start, void* last);
ysr@777 707
ysr@777 708 bool isPrevMarked(oop p) const {
ysr@777 709 assert(p != NULL && p->is_oop(), "expected an oop");
ysr@777 710 HeapWord* addr = (HeapWord*)p;
ysr@777 711 assert(addr >= _prevMarkBitMap->startWord() ||
ysr@777 712 addr < _prevMarkBitMap->endWord(), "in a region");
ysr@777 713
ysr@777 714 return _prevMarkBitMap->isMarked(addr);
ysr@777 715 }
ysr@777 716
ysr@777 717 inline bool do_yield_check(int worker_i = 0);
ysr@777 718 inline bool should_yield();
ysr@777 719
ysr@777 720 // Called to abort the marking cycle after a Full GC takes palce.
ysr@777 721 void abort();
ysr@777 722
ysr@777 723 void disable_co_trackers();
ysr@777 724
ysr@777 725 // This prints the global/local fingers. It is used for debugging.
ysr@777 726 NOT_PRODUCT(void print_finger();)
ysr@777 727
ysr@777 728 void print_summary_info();
ysr@777 729
ysr@777 730 // The following indicate whether a given verbose level has been
ysr@777 731 // set. Notice that anything above stats is conditional to
ysr@777 732 // _MARKING_VERBOSE_ having been set to 1
ysr@777 733 bool verbose_stats()
ysr@777 734 { return _verbose_level >= stats_verbose; }
ysr@777 735 bool verbose_low()
ysr@777 736 { return _MARKING_VERBOSE_ && _verbose_level >= low_verbose; }
ysr@777 737 bool verbose_medium()
ysr@777 738 { return _MARKING_VERBOSE_ && _verbose_level >= medium_verbose; }
ysr@777 739 bool verbose_high()
ysr@777 740 { return _MARKING_VERBOSE_ && _verbose_level >= high_verbose; }
ysr@777 741 };
ysr@777 742
ysr@777 743 // A class representing a marking task.
ysr@777 744 class CMTask : public TerminatorTerminator {
ysr@777 745 private:
ysr@777 746 enum PrivateConstants {
ysr@777 747 // the regular clock call is called once the scanned words reaches
ysr@777 748 // this limit
ysr@777 749 words_scanned_period = 12*1024,
ysr@777 750 // the regular clock call is called once the number of visited
ysr@777 751 // references reaches this limit
ysr@777 752 refs_reached_period = 384,
ysr@777 753 // initial value for the hash seed, used in the work stealing code
ysr@777 754 init_hash_seed = 17,
ysr@777 755 // how many entries will be transferred between global stack and
ysr@777 756 // local queues
ysr@777 757 global_stack_transfer_size = 16
ysr@777 758 };
ysr@777 759
ysr@777 760 int _task_id;
ysr@777 761 G1CollectedHeap* _g1h;
ysr@777 762 ConcurrentMark* _cm;
ysr@777 763 CMBitMap* _nextMarkBitMap;
ysr@777 764 // the task queue of this task
ysr@777 765 CMTaskQueue* _task_queue;
ysr@1280 766 private:
ysr@777 767 // the task queue set---needed for stealing
ysr@777 768 CMTaskQueueSet* _task_queues;
ysr@777 769 // indicates whether the task has been claimed---this is only for
ysr@777 770 // debugging purposes
ysr@777 771 bool _claimed;
ysr@777 772
ysr@777 773 // number of calls to this task
ysr@777 774 int _calls;
ysr@777 775
ysr@777 776 // concurrent overhead over a single CPU for this task
ysr@777 777 COTracker _co_tracker;
ysr@777 778
ysr@777 779 // when the virtual timer reaches this time, the marking step should
ysr@777 780 // exit
ysr@777 781 double _time_target_ms;
ysr@777 782 // the start time of the current marking step
ysr@777 783 double _start_time_ms;
ysr@777 784
ysr@777 785 // the oop closure used for iterations over oops
ysr@777 786 OopClosure* _oop_closure;
ysr@777 787
ysr@777 788 // the region this task is scanning, NULL if we're not scanning any
ysr@777 789 HeapRegion* _curr_region;
ysr@777 790 // the local finger of this task, NULL if we're not scanning a region
ysr@777 791 HeapWord* _finger;
ysr@777 792 // limit of the region this task is scanning, NULL if we're not scanning one
ysr@777 793 HeapWord* _region_limit;
ysr@777 794
ysr@777 795 // This is used only when we scan regions popped from the region
ysr@777 796 // stack. It records what the last object on such a region we
ysr@777 797 // scanned was. It is used to ensure that, if we abort region
ysr@777 798 // iteration, we do not rescan the first part of the region. This
ysr@777 799 // should be NULL when we're not scanning a region from the region
ysr@777 800 // stack.
ysr@777 801 HeapWord* _region_finger;
ysr@777 802
ysr@777 803 // the number of words this task has scanned
ysr@777 804 size_t _words_scanned;
ysr@777 805 // When _words_scanned reaches this limit, the regular clock is
ysr@777 806 // called. Notice that this might be decreased under certain
ysr@777 807 // circumstances (i.e. when we believe that we did an expensive
ysr@777 808 // operation).
ysr@777 809 size_t _words_scanned_limit;
ysr@777 810 // the initial value of _words_scanned_limit (i.e. what it was
ysr@777 811 // before it was decreased).
ysr@777 812 size_t _real_words_scanned_limit;
ysr@777 813
ysr@777 814 // the number of references this task has visited
ysr@777 815 size_t _refs_reached;
ysr@777 816 // When _refs_reached reaches this limit, the regular clock is
ysr@777 817 // called. Notice this this might be decreased under certain
ysr@777 818 // circumstances (i.e. when we believe that we did an expensive
ysr@777 819 // operation).
ysr@777 820 size_t _refs_reached_limit;
ysr@777 821 // the initial value of _refs_reached_limit (i.e. what it was before
ysr@777 822 // it was decreased).
ysr@777 823 size_t _real_refs_reached_limit;
ysr@777 824
ysr@777 825 // used by the work stealing stuff
ysr@777 826 int _hash_seed;
ysr@777 827 // if this is true, then the task has aborted for some reason
ysr@777 828 bool _has_aborted;
ysr@777 829 // set when the task aborts because it has met its time quota
ysr@777 830 bool _has_aborted_timed_out;
ysr@777 831 // true when we're draining SATB buffers; this avoids the task
ysr@777 832 // aborting due to SATB buffers being available (as we're already
ysr@777 833 // dealing with them)
ysr@777 834 bool _draining_satb_buffers;
ysr@777 835
ysr@777 836 // number sequence of past step times
ysr@777 837 NumberSeq _step_times_ms;
ysr@777 838 // elapsed time of this task
ysr@777 839 double _elapsed_time_ms;
ysr@777 840 // termination time of this task
ysr@777 841 double _termination_time_ms;
ysr@777 842 // when this task got into the termination protocol
ysr@777 843 double _termination_start_time_ms;
ysr@777 844
ysr@777 845 // true when the task is during a concurrent phase, false when it is
ysr@777 846 // in the remark phase (so, in the latter case, we do not have to
ysr@777 847 // check all the things that we have to check during the concurrent
ysr@777 848 // phase, i.e. SATB buffer availability...)
ysr@777 849 bool _concurrent;
ysr@777 850
ysr@777 851 TruncatedSeq _marking_step_diffs_ms;
ysr@777 852
ysr@777 853 // LOTS of statistics related with this task
ysr@777 854 #if _MARKING_STATS_
ysr@777 855 NumberSeq _all_clock_intervals_ms;
ysr@777 856 double _interval_start_time_ms;
ysr@777 857
ysr@777 858 int _aborted;
ysr@777 859 int _aborted_overflow;
ysr@777 860 int _aborted_cm_aborted;
ysr@777 861 int _aborted_yield;
ysr@777 862 int _aborted_timed_out;
ysr@777 863 int _aborted_satb;
ysr@777 864 int _aborted_termination;
ysr@777 865
ysr@777 866 int _steal_attempts;
ysr@777 867 int _steals;
ysr@777 868
ysr@777 869 int _clock_due_to_marking;
ysr@777 870 int _clock_due_to_scanning;
ysr@777 871
ysr@777 872 int _local_pushes;
ysr@777 873 int _local_pops;
ysr@777 874 int _local_max_size;
ysr@777 875 int _objs_scanned;
ysr@777 876
ysr@777 877 int _global_pushes;
ysr@777 878 int _global_pops;
ysr@777 879 int _global_max_size;
ysr@777 880
ysr@777 881 int _global_transfers_to;
ysr@777 882 int _global_transfers_from;
ysr@777 883
ysr@777 884 int _region_stack_pops;
ysr@777 885
ysr@777 886 int _regions_claimed;
ysr@777 887 int _objs_found_on_bitmap;
ysr@777 888
ysr@777 889 int _satb_buffers_processed;
ysr@777 890 #endif // _MARKING_STATS_
ysr@777 891
ysr@777 892 // it updates the local fields after this task has claimed
ysr@777 893 // a new region to scan
ysr@777 894 void setup_for_region(HeapRegion* hr);
ysr@777 895 // it brings up-to-date the limit of the region
ysr@777 896 void update_region_limit();
ysr@777 897 // it resets the local fields after a task has finished scanning a
ysr@777 898 // region
ysr@777 899 void giveup_current_region();
ysr@777 900
ysr@777 901 // called when either the words scanned or the refs visited limit
ysr@777 902 // has been reached
ysr@777 903 void reached_limit();
ysr@777 904 // recalculates the words scanned and refs visited limits
ysr@777 905 void recalculate_limits();
ysr@777 906 // decreases the words scanned and refs visited limits when we reach
ysr@777 907 // an expensive operation
ysr@777 908 void decrease_limits();
ysr@777 909 // it checks whether the words scanned or refs visited reached their
ysr@777 910 // respective limit and calls reached_limit() if they have
ysr@777 911 void check_limits() {
ysr@777 912 if (_words_scanned >= _words_scanned_limit ||
ysr@777 913 _refs_reached >= _refs_reached_limit)
ysr@777 914 reached_limit();
ysr@777 915 }
ysr@777 916 // this is supposed to be called regularly during a marking step as
ysr@777 917 // it checks a bunch of conditions that might cause the marking step
ysr@777 918 // to abort
ysr@777 919 void regular_clock_call();
ysr@777 920 bool concurrent() { return _concurrent; }
ysr@777 921
ysr@777 922 public:
ysr@777 923 // It resets the task; it should be called right at the beginning of
ysr@777 924 // a marking phase.
ysr@777 925 void reset(CMBitMap* _nextMarkBitMap);
ysr@777 926 // it clears all the fields that correspond to a claimed region.
ysr@777 927 void clear_region_fields();
ysr@777 928
ysr@777 929 void set_concurrent(bool concurrent) { _concurrent = concurrent; }
ysr@777 930
ysr@777 931 void enable_co_tracker() {
ysr@777 932 guarantee( !_co_tracker.enabled(), "invariant" );
ysr@777 933 _co_tracker.enable();
ysr@777 934 }
ysr@777 935 void disable_co_tracker() {
ysr@777 936 guarantee( _co_tracker.enabled(), "invariant" );
ysr@777 937 _co_tracker.disable();
ysr@777 938 }
ysr@777 939 bool co_tracker_enabled() {
ysr@777 940 return _co_tracker.enabled();
ysr@777 941 }
ysr@777 942 void reset_co_tracker(double starting_conc_overhead = 0.0) {
ysr@777 943 _co_tracker.reset(starting_conc_overhead);
ysr@777 944 }
ysr@777 945 void start_co_tracker() {
ysr@777 946 _co_tracker.start();
ysr@777 947 }
ysr@777 948 void update_co_tracker(bool force_end = false) {
ysr@777 949 _co_tracker.update(force_end);
ysr@777 950 }
ysr@777 951
ysr@777 952 // The main method of this class which performs a marking step
ysr@777 953 // trying not to exceed the given duration. However, it might exit
ysr@777 954 // prematurely, according to some conditions (i.e. SATB buffers are
ysr@777 955 // available for processing).
ysr@777 956 void do_marking_step(double target_ms);
ysr@777 957
ysr@777 958 // These two calls start and stop the timer
ysr@777 959 void record_start_time() {
ysr@777 960 _elapsed_time_ms = os::elapsedTime() * 1000.0;
ysr@777 961 }
ysr@777 962 void record_end_time() {
ysr@777 963 _elapsed_time_ms = os::elapsedTime() * 1000.0 - _elapsed_time_ms;
ysr@777 964 }
ysr@777 965
ysr@777 966 // returns the task ID
ysr@777 967 int task_id() { return _task_id; }
ysr@777 968
ysr@777 969 // From TerminatorTerminator. It determines whether this task should
ysr@777 970 // exit the termination protocol after it's entered it.
ysr@777 971 virtual bool should_exit_termination();
ysr@777 972
ysr@777 973 HeapWord* finger() { return _finger; }
ysr@777 974
ysr@777 975 bool has_aborted() { return _has_aborted; }
ysr@777 976 void set_has_aborted() { _has_aborted = true; }
ysr@777 977 void clear_has_aborted() { _has_aborted = false; }
ysr@777 978 bool claimed() { return _claimed; }
ysr@777 979
ysr@777 980 void set_oop_closure(OopClosure* oop_closure) {
ysr@777 981 _oop_closure = oop_closure;
ysr@777 982 }
ysr@777 983
ysr@777 984 // It grays the object by marking it and, if necessary, pushing it
ysr@777 985 // on the local queue
ysr@777 986 void deal_with_reference(oop obj);
ysr@777 987
ysr@777 988 // It scans an object and visits its children.
ysr@777 989 void scan_object(oop obj) {
ysr@777 990 tmp_guarantee_CM( _nextMarkBitMap->isMarked((HeapWord*) obj),
ysr@777 991 "invariant" );
ysr@777 992
ysr@777 993 if (_cm->verbose_high())
ysr@777 994 gclog_or_tty->print_cr("[%d] we're scanning object "PTR_FORMAT,
ysr@777 995 _task_id, (void*) obj);
ysr@777 996
ysr@777 997 size_t obj_size = obj->size();
ysr@777 998 _words_scanned += obj_size;
ysr@777 999
ysr@777 1000 obj->oop_iterate(_oop_closure);
ysr@777 1001 statsOnly( ++_objs_scanned );
ysr@777 1002 check_limits();
ysr@777 1003 }
ysr@777 1004
ysr@777 1005 // It pushes an object on the local queue.
ysr@777 1006 void push(oop obj);
ysr@777 1007
ysr@777 1008 // These two move entries to/from the global stack.
ysr@777 1009 void move_entries_to_global_stack();
ysr@777 1010 void get_entries_from_global_stack();
ysr@777 1011
ysr@777 1012 // It pops and scans objects from the local queue. If partially is
ysr@777 1013 // true, then it stops when the queue size is of a given limit. If
ysr@777 1014 // partially is false, then it stops when the queue is empty.
ysr@777 1015 void drain_local_queue(bool partially);
ysr@777 1016 // It moves entries from the global stack to the local queue and
ysr@777 1017 // drains the local queue. If partially is true, then it stops when
ysr@777 1018 // both the global stack and the local queue reach a given size. If
ysr@777 1019 // partially if false, it tries to empty them totally.
ysr@777 1020 void drain_global_stack(bool partially);
ysr@777 1021 // It keeps picking SATB buffers and processing them until no SATB
ysr@777 1022 // buffers are available.
ysr@777 1023 void drain_satb_buffers();
ysr@777 1024 // It keeps popping regions from the region stack and processing
ysr@777 1025 // them until the region stack is empty.
ysr@777 1026 void drain_region_stack(BitMapClosure* closure);
ysr@777 1027
ysr@777 1028 // moves the local finger to a new location
ysr@777 1029 inline void move_finger_to(HeapWord* new_finger) {
ysr@777 1030 tmp_guarantee_CM( new_finger >= _finger && new_finger < _region_limit,
ysr@777 1031 "invariant" );
ysr@777 1032 _finger = new_finger;
ysr@777 1033 }
ysr@777 1034
ysr@777 1035 // moves the region finger to a new location
ysr@777 1036 inline void move_region_finger_to(HeapWord* new_finger) {
ysr@777 1037 tmp_guarantee_CM( new_finger < _cm->finger(), "invariant" );
ysr@777 1038 _region_finger = new_finger;
ysr@777 1039 }
ysr@777 1040
ysr@777 1041 CMTask(int task_num, ConcurrentMark *cm,
ysr@777 1042 CMTaskQueue* task_queue, CMTaskQueueSet* task_queues);
ysr@777 1043
ysr@777 1044 // it prints statistics associated with this task
ysr@777 1045 void print_stats();
ysr@777 1046
ysr@777 1047 #if _MARKING_STATS_
ysr@777 1048 void increase_objs_found_on_bitmap() { ++_objs_found_on_bitmap; }
ysr@777 1049 #endif // _MARKING_STATS_
ysr@777 1050 };

mercurial