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

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

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

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

ysr@777 1 /*
trims@1907 2 * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
ysr@777 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
ysr@777 4 *
ysr@777 5 * This code is free software; you can redistribute it and/or modify it
ysr@777 6 * under the terms of the GNU General Public License version 2 only, as
ysr@777 7 * published by the Free Software Foundation.
ysr@777 8 *
ysr@777 9 * This code is distributed in the hope that it will be useful, but WITHOUT
ysr@777 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
ysr@777 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
ysr@777 12 * version 2 for more details (a copy is included in the LICENSE file that
ysr@777 13 * accompanied this code).
ysr@777 14 *
ysr@777 15 * You should have received a copy of the GNU General Public License version
ysr@777 16 * 2 along with this work; if not, write to the Free Software Foundation,
ysr@777 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
ysr@777 18 *
trims@1907 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
trims@1907 20 * or visit www.oracle.com if you need additional information or have any
trims@1907 21 * questions.
ysr@777 22 *
ysr@777 23 */
ysr@777 24
ysr@777 25 class G1CollectedHeap;
ysr@777 26 class CMTask;
jcoomes@1746 27 typedef GenericTaskQueue<oop> CMTaskQueue;
jcoomes@1746 28 typedef GenericTaskQueueSet<CMTaskQueue> 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
tonyp@1793 255 #if 0
tonyp@1793 256 // This is currently not used. See the comment in the .cpp file.
tonyp@1793 257
ysr@777 258 // Lock-free; assumes that it will only be called in parallel
ysr@777 259 // with other "pop" operations (no pushes).
ysr@777 260 MemRegion pop();
tonyp@1793 261 #endif // 0
tonyp@1793 262
tonyp@1793 263 // These two are the implementations that use a lock. They can be
tonyp@1793 264 // called concurrently with each other but they should not be called
tonyp@1793 265 // concurrently with the lock-free versions (push() / pop()).
tonyp@1793 266 void push_with_lock(MemRegion mr);
tonyp@1793 267 MemRegion pop_with_lock();
ysr@777 268
ysr@777 269 bool isEmpty() { return _index == 0; }
ysr@777 270 bool isFull() { return _index == _capacity; }
ysr@777 271
ysr@777 272 bool overflow() { return _overflow; }
ysr@777 273 void clear_overflow() { _overflow = false; }
ysr@777 274
ysr@777 275 int size() { return _index; }
ysr@777 276
ysr@777 277 // It iterates over the entries in the region stack and it
ysr@777 278 // invalidates (i.e. assigns MemRegion()) the ones that point to
ysr@777 279 // regions in the collection set.
ysr@777 280 bool invalidate_entries_into_cset();
ysr@777 281
ysr@777 282 // This gives an upper bound up to which the iteration in
ysr@777 283 // invalidate_entries_into_cset() will reach. This prevents
ysr@777 284 // newly-added entries to be unnecessarily scanned.
ysr@777 285 void set_oops_do_bound() {
ysr@777 286 _oops_do_bound = _index;
ysr@777 287 }
ysr@777 288
ysr@777 289 void setEmpty() { _index = 0; clear_overflow(); }
ysr@777 290 };
ysr@777 291
ysr@777 292 // this will enable a variety of different statistics per GC task
ysr@777 293 #define _MARKING_STATS_ 0
ysr@777 294 // this will enable the higher verbose levels
ysr@777 295 #define _MARKING_VERBOSE_ 0
ysr@777 296
ysr@777 297 #if _MARKING_STATS_
ysr@777 298 #define statsOnly(statement) \
ysr@777 299 do { \
ysr@777 300 statement ; \
ysr@777 301 } while (0)
ysr@777 302 #else // _MARKING_STATS_
ysr@777 303 #define statsOnly(statement) \
ysr@777 304 do { \
ysr@777 305 } while (0)
ysr@777 306 #endif // _MARKING_STATS_
ysr@777 307
ysr@777 308 typedef enum {
ysr@777 309 no_verbose = 0, // verbose turned off
ysr@777 310 stats_verbose, // only prints stats at the end of marking
ysr@777 311 low_verbose, // low verbose, mostly per region and per major event
ysr@777 312 medium_verbose, // a bit more detailed than low
ysr@777 313 high_verbose // per object verbose
ysr@777 314 } CMVerboseLevel;
ysr@777 315
ysr@777 316
ysr@777 317 class ConcurrentMarkThread;
ysr@777 318
apetrusenko@984 319 class ConcurrentMark: public CHeapObj {
ysr@777 320 friend class ConcurrentMarkThread;
ysr@777 321 friend class CMTask;
ysr@777 322 friend class CMBitMapClosure;
ysr@777 323 friend class CSMarkOopClosure;
ysr@777 324 friend class CMGlobalObjectClosure;
ysr@777 325 friend class CMRemarkTask;
ysr@777 326 friend class CMConcurrentMarkingTask;
ysr@777 327 friend class G1ParNoteEndTask;
ysr@777 328 friend class CalcLiveObjectsClosure;
ysr@777 329
ysr@777 330 protected:
ysr@777 331 ConcurrentMarkThread* _cmThread; // the thread doing the work
ysr@777 332 G1CollectedHeap* _g1h; // the heap.
ysr@777 333 size_t _parallel_marking_threads; // the number of marking
ysr@777 334 // threads we'll use
ysr@777 335 double _sleep_factor; // how much we have to sleep, with
ysr@777 336 // respect to the work we just did, to
ysr@777 337 // meet the marking overhead goal
ysr@777 338 double _marking_task_overhead; // marking target overhead for
ysr@777 339 // a single task
ysr@777 340
ysr@777 341 // same as the two above, but for the cleanup task
ysr@777 342 double _cleanup_sleep_factor;
ysr@777 343 double _cleanup_task_overhead;
ysr@777 344
ysr@777 345 // Stuff related to age cohort processing.
ysr@777 346 struct ParCleanupThreadState {
ysr@777 347 char _pre[64];
ysr@777 348 UncleanRegionList list;
ysr@777 349 char _post[64];
ysr@777 350 };
ysr@777 351 ParCleanupThreadState** _par_cleanup_thread_state;
ysr@777 352
ysr@777 353 // CMS marking support structures
ysr@777 354 CMBitMap _markBitMap1;
ysr@777 355 CMBitMap _markBitMap2;
ysr@777 356 CMBitMapRO* _prevMarkBitMap; // completed mark bitmap
ysr@777 357 CMBitMap* _nextMarkBitMap; // under-construction mark bitmap
ysr@777 358 bool _at_least_one_mark_complete;
ysr@777 359
ysr@777 360 BitMap _region_bm;
ysr@777 361 BitMap _card_bm;
ysr@777 362
ysr@777 363 // Heap bounds
ysr@777 364 HeapWord* _heap_start;
ysr@777 365 HeapWord* _heap_end;
ysr@777 366
ysr@777 367 // For gray objects
ysr@777 368 CMMarkStack _markStack; // Grey objects behind global finger.
ysr@777 369 CMRegionStack _regionStack; // Grey regions behind global finger.
ysr@777 370 HeapWord* volatile _finger; // the global finger, region aligned,
ysr@777 371 // always points to the end of the
ysr@777 372 // last claimed region
ysr@777 373
ysr@777 374 // marking tasks
ysr@777 375 size_t _max_task_num; // maximum task number
ysr@777 376 size_t _active_tasks; // task num currently active
ysr@777 377 CMTask** _tasks; // task queue array (max_task_num len)
ysr@777 378 CMTaskQueueSet* _task_queues; // task queue set
ysr@777 379 ParallelTaskTerminator _terminator; // for termination
ysr@777 380
ysr@777 381 // Two sync barriers that are used to synchronise tasks when an
ysr@777 382 // overflow occurs. The algorithm is the following. All tasks enter
ysr@777 383 // the first one to ensure that they have all stopped manipulating
ysr@777 384 // the global data structures. After they exit it, they re-initialise
ysr@777 385 // their data structures and task 0 re-initialises the global data
ysr@777 386 // structures. Then, they enter the second sync barrier. This
ysr@777 387 // ensure, that no task starts doing work before all data
ysr@777 388 // structures (local and global) have been re-initialised. When they
ysr@777 389 // exit it, they are free to start working again.
ysr@777 390 WorkGangBarrierSync _first_overflow_barrier_sync;
ysr@777 391 WorkGangBarrierSync _second_overflow_barrier_sync;
ysr@777 392
ysr@777 393
ysr@777 394 // this is set by any task, when an overflow on the global data
ysr@777 395 // structures is detected.
ysr@777 396 volatile bool _has_overflown;
ysr@777 397 // true: marking is concurrent, false: we're in remark
ysr@777 398 volatile bool _concurrent;
ysr@777 399 // set at the end of a Full GC so that marking aborts
ysr@777 400 volatile bool _has_aborted;
ysr@777 401 // used when remark aborts due to an overflow to indicate that
ysr@777 402 // another concurrent marking phase should start
ysr@777 403 volatile bool _restart_for_overflow;
ysr@777 404
ysr@777 405 // This is true from the very start of concurrent marking until the
ysr@777 406 // point when all the tasks complete their work. It is really used
ysr@777 407 // to determine the points between the end of concurrent marking and
ysr@777 408 // time of remark.
ysr@777 409 volatile bool _concurrent_marking_in_progress;
ysr@777 410
ysr@777 411 // verbose level
ysr@777 412 CMVerboseLevel _verbose_level;
ysr@777 413
ysr@777 414 // These two fields are used to implement the optimisation that
ysr@777 415 // avoids pushing objects on the global/region stack if there are
ysr@777 416 // no collection set regions above the lowest finger.
ysr@777 417
ysr@777 418 // This is the lowest finger (among the global and local fingers),
ysr@777 419 // which is calculated before a new collection set is chosen.
ysr@777 420 HeapWord* _min_finger;
ysr@777 421 // If this flag is true, objects/regions that are marked below the
ysr@777 422 // finger should be pushed on the stack(s). If this is flag is
ysr@777 423 // false, it is safe not to push them on the stack(s).
ysr@777 424 bool _should_gray_objects;
ysr@777 425
ysr@777 426 // All of these times are in ms.
ysr@777 427 NumberSeq _init_times;
ysr@777 428 NumberSeq _remark_times;
ysr@777 429 NumberSeq _remark_mark_times;
ysr@777 430 NumberSeq _remark_weak_ref_times;
ysr@777 431 NumberSeq _cleanup_times;
ysr@777 432 double _total_counting_time;
ysr@777 433 double _total_rs_scrub_time;
ysr@777 434
ysr@777 435 double* _accum_task_vtime; // accumulated task vtime
ysr@777 436
ysr@777 437 WorkGang* _parallel_workers;
ysr@777 438
ysr@777 439 void weakRefsWork(bool clear_all_soft_refs);
ysr@777 440
ysr@777 441 void swapMarkBitMaps();
ysr@777 442
ysr@777 443 // It resets the global marking data structures, as well as the
ysr@777 444 // task local ones; should be called during initial mark.
ysr@777 445 void reset();
ysr@777 446 // It resets all the marking data structures.
ysr@777 447 void clear_marking_state();
ysr@777 448
ysr@777 449 // It should be called to indicate which phase we're in (concurrent
ysr@777 450 // mark or remark) and how many threads are currently active.
ysr@777 451 void set_phase(size_t active_tasks, bool concurrent);
ysr@777 452 // We do this after we're done with marking so that the marking data
ysr@777 453 // structures are initialised to a sensible and predictable state.
ysr@777 454 void set_non_marking_state();
ysr@777 455
ysr@777 456 // prints all gathered CM-related statistics
ysr@777 457 void print_stats();
ysr@777 458
ysr@777 459 // accessor methods
ysr@777 460 size_t parallel_marking_threads() { return _parallel_marking_threads; }
ysr@777 461 double sleep_factor() { return _sleep_factor; }
ysr@777 462 double marking_task_overhead() { return _marking_task_overhead;}
ysr@777 463 double cleanup_sleep_factor() { return _cleanup_sleep_factor; }
ysr@777 464 double cleanup_task_overhead() { return _cleanup_task_overhead;}
ysr@777 465
ysr@777 466 HeapWord* finger() { return _finger; }
ysr@777 467 bool concurrent() { return _concurrent; }
ysr@777 468 size_t active_tasks() { return _active_tasks; }
ysr@777 469 ParallelTaskTerminator* terminator() { return &_terminator; }
ysr@777 470
ysr@777 471 // It claims the next available region to be scanned by a marking
ysr@777 472 // task. It might return NULL if the next region is empty or we have
ysr@777 473 // run out of regions. In the latter case, out_of_regions()
ysr@777 474 // determines whether we've really run out of regions or the task
ysr@777 475 // should call claim_region() again. This might seem a bit
ysr@777 476 // awkward. Originally, the code was written so that claim_region()
ysr@777 477 // either successfully returned with a non-empty region or there
ysr@777 478 // were no more regions to be claimed. The problem with this was
ysr@777 479 // that, in certain circumstances, it iterated over large chunks of
ysr@777 480 // the heap finding only empty regions and, while it was working, it
ysr@777 481 // was preventing the calling task to call its regular clock
ysr@777 482 // method. So, this way, each task will spend very little time in
ysr@777 483 // claim_region() and is allowed to call the regular clock method
ysr@777 484 // frequently.
ysr@777 485 HeapRegion* claim_region(int task);
ysr@777 486
ysr@777 487 // It determines whether we've run out of regions to scan.
ysr@777 488 bool out_of_regions() { return _finger == _heap_end; }
ysr@777 489
ysr@777 490 // Returns the task with the given id
ysr@777 491 CMTask* task(int id) {
tonyp@1458 492 assert(0 <= id && id < (int) _active_tasks,
tonyp@1458 493 "task id not within active bounds");
ysr@777 494 return _tasks[id];
ysr@777 495 }
ysr@777 496
ysr@777 497 // Returns the task queue with the given id
ysr@777 498 CMTaskQueue* task_queue(int id) {
tonyp@1458 499 assert(0 <= id && id < (int) _active_tasks,
tonyp@1458 500 "task queue id not within active bounds");
ysr@777 501 return (CMTaskQueue*) _task_queues->queue(id);
ysr@777 502 }
ysr@777 503
ysr@777 504 // Returns the task queue set
ysr@777 505 CMTaskQueueSet* task_queues() { return _task_queues; }
ysr@777 506
ysr@777 507 // Access / manipulation of the overflow flag which is set to
ysr@777 508 // indicate that the global stack or region stack has overflown
ysr@777 509 bool has_overflown() { return _has_overflown; }
ysr@777 510 void set_has_overflown() { _has_overflown = true; }
ysr@777 511 void clear_has_overflown() { _has_overflown = false; }
ysr@777 512
ysr@777 513 bool has_aborted() { return _has_aborted; }
ysr@777 514 bool restart_for_overflow() { return _restart_for_overflow; }
ysr@777 515
ysr@777 516 // Methods to enter the two overflow sync barriers
ysr@777 517 void enter_first_sync_barrier(int task_num);
ysr@777 518 void enter_second_sync_barrier(int task_num);
ysr@777 519
ysr@777 520 public:
ysr@777 521 // Manipulation of the global mark stack.
ysr@777 522 // Notice that the first mark_stack_push is CAS-based, whereas the
ysr@777 523 // two below are Mutex-based. This is OK since the first one is only
ysr@777 524 // called during evacuation pauses and doesn't compete with the
ysr@777 525 // other two (which are called by the marking tasks during
ysr@777 526 // concurrent marking or remark).
ysr@777 527 bool mark_stack_push(oop p) {
ysr@777 528 _markStack.par_push(p);
ysr@777 529 if (_markStack.overflow()) {
ysr@777 530 set_has_overflown();
ysr@777 531 return false;
ysr@777 532 }
ysr@777 533 return true;
ysr@777 534 }
ysr@777 535 bool mark_stack_push(oop* arr, int n) {
ysr@777 536 _markStack.par_push_arr(arr, n);
ysr@777 537 if (_markStack.overflow()) {
ysr@777 538 set_has_overflown();
ysr@777 539 return false;
ysr@777 540 }
ysr@777 541 return true;
ysr@777 542 }
ysr@777 543 void mark_stack_pop(oop* arr, int max, int* n) {
ysr@777 544 _markStack.par_pop_arr(arr, max, n);
ysr@777 545 }
ysr@777 546 size_t mark_stack_size() { return _markStack.size(); }
ysr@777 547 size_t partial_mark_stack_size_target() { return _markStack.maxElems()/3; }
ysr@777 548 bool mark_stack_overflow() { return _markStack.overflow(); }
ysr@777 549 bool mark_stack_empty() { return _markStack.isEmpty(); }
ysr@777 550
ysr@777 551 // Manipulation of the region stack
ysr@777 552 bool region_stack_push(MemRegion mr) {
tonyp@1793 553 // Currently we only call the lock-free version during evacuation
tonyp@1793 554 // pauses.
tonyp@1793 555 assert(SafepointSynchronize::is_at_safepoint(), "world should be stopped");
tonyp@1793 556
ysr@777 557 _regionStack.push(mr);
ysr@777 558 if (_regionStack.overflow()) {
ysr@777 559 set_has_overflown();
ysr@777 560 return false;
ysr@777 561 }
ysr@777 562 return true;
ysr@777 563 }
tonyp@1793 564 #if 0
tonyp@1793 565 // Currently this is not used. See the comment in the .cpp file.
tonyp@1793 566 MemRegion region_stack_pop() { return _regionStack.pop(); }
tonyp@1793 567 #endif // 0
tonyp@1793 568
tonyp@1793 569 bool region_stack_push_with_lock(MemRegion mr) {
tonyp@1793 570 // Currently we only call the lock-based version during either
tonyp@1793 571 // concurrent marking or remark.
tonyp@1793 572 assert(!SafepointSynchronize::is_at_safepoint() || !concurrent(),
tonyp@1793 573 "if we are at a safepoint it should be the remark safepoint");
tonyp@1793 574
tonyp@1793 575 _regionStack.push_with_lock(mr);
tonyp@1793 576 if (_regionStack.overflow()) {
tonyp@1793 577 set_has_overflown();
tonyp@1793 578 return false;
tonyp@1793 579 }
tonyp@1793 580 return true;
tonyp@1793 581 }
tonyp@1793 582 MemRegion region_stack_pop_with_lock() {
tonyp@1793 583 // Currently we only call the lock-based version during either
tonyp@1793 584 // concurrent marking or remark.
tonyp@1793 585 assert(!SafepointSynchronize::is_at_safepoint() || !concurrent(),
tonyp@1793 586 "if we are at a safepoint it should be the remark safepoint");
tonyp@1793 587
tonyp@1793 588 return _regionStack.pop_with_lock();
tonyp@1793 589 }
tonyp@1793 590
ysr@777 591 int region_stack_size() { return _regionStack.size(); }
ysr@777 592 bool region_stack_overflow() { return _regionStack.overflow(); }
ysr@777 593 bool region_stack_empty() { return _regionStack.isEmpty(); }
ysr@777 594
ysr@777 595 bool concurrent_marking_in_progress() {
ysr@777 596 return _concurrent_marking_in_progress;
ysr@777 597 }
ysr@777 598 void set_concurrent_marking_in_progress() {
ysr@777 599 _concurrent_marking_in_progress = true;
ysr@777 600 }
ysr@777 601 void clear_concurrent_marking_in_progress() {
ysr@777 602 _concurrent_marking_in_progress = false;
ysr@777 603 }
ysr@777 604
ysr@777 605 void update_accum_task_vtime(int i, double vtime) {
ysr@777 606 _accum_task_vtime[i] += vtime;
ysr@777 607 }
ysr@777 608
ysr@777 609 double all_task_accum_vtime() {
ysr@777 610 double ret = 0.0;
ysr@777 611 for (int i = 0; i < (int)_max_task_num; ++i)
ysr@777 612 ret += _accum_task_vtime[i];
ysr@777 613 return ret;
ysr@777 614 }
ysr@777 615
ysr@777 616 // Attempts to steal an object from the task queues of other tasks
ysr@777 617 bool try_stealing(int task_num, int* hash_seed, oop& obj) {
ysr@777 618 return _task_queues->steal(task_num, hash_seed, obj);
ysr@777 619 }
ysr@777 620
ysr@777 621 // It grays an object by first marking it. Then, if it's behind the
ysr@777 622 // global finger, it also pushes it on the global stack.
ysr@777 623 void deal_with_reference(oop obj);
ysr@777 624
ysr@777 625 ConcurrentMark(ReservedSpace rs, int max_regions);
ysr@777 626 ~ConcurrentMark();
ysr@777 627 ConcurrentMarkThread* cmThread() { return _cmThread; }
ysr@777 628
ysr@777 629 CMBitMapRO* prevMarkBitMap() const { return _prevMarkBitMap; }
ysr@777 630 CMBitMap* nextMarkBitMap() const { return _nextMarkBitMap; }
ysr@777 631
ysr@777 632 // The following three are interaction between CM and
ysr@777 633 // G1CollectedHeap
ysr@777 634
ysr@777 635 // This notifies CM that a root during initial-mark needs to be
ysr@777 636 // grayed and it's MT-safe. Currently, we just mark it. But, in the
ysr@777 637 // future, we can experiment with pushing it on the stack and we can
ysr@777 638 // do this without changing G1CollectedHeap.
ysr@777 639 void grayRoot(oop p);
ysr@777 640 // It's used during evacuation pauses to gray a region, if
ysr@777 641 // necessary, and it's MT-safe. It assumes that the caller has
ysr@777 642 // marked any objects on that region. If _should_gray_objects is
ysr@777 643 // true and we're still doing concurrent marking, the region is
ysr@777 644 // pushed on the region stack, if it is located below the global
ysr@777 645 // finger, otherwise we do nothing.
ysr@777 646 void grayRegionIfNecessary(MemRegion mr);
ysr@777 647 // It's used during evacuation pauses to mark and, if necessary,
ysr@777 648 // gray a single object and it's MT-safe. It assumes the caller did
ysr@777 649 // not mark the object. If _should_gray_objects is true and we're
ysr@777 650 // still doing concurrent marking, the objects is pushed on the
ysr@777 651 // global stack, if it is located below the global finger, otherwise
ysr@777 652 // we do nothing.
ysr@777 653 void markAndGrayObjectIfNecessary(oop p);
ysr@777 654
tonyp@1823 655 // It iterates over the heap and for each object it comes across it
tonyp@1823 656 // will dump the contents of its reference fields, as well as
tonyp@1823 657 // liveness information for the object and its referents. The dump
tonyp@1823 658 // will be written to a file with the following name:
tonyp@1823 659 // G1PrintReachableBaseFile + "." + str. use_prev_marking decides
tonyp@1823 660 // whether the prev (use_prev_marking == true) or next
tonyp@1823 661 // (use_prev_marking == false) marking information will be used to
tonyp@1823 662 // determine the liveness of each object / referent. If all is true,
tonyp@1823 663 // all objects in the heap will be dumped, otherwise only the live
tonyp@1823 664 // ones. In the dump the following symbols / abbreviations are used:
tonyp@1823 665 // M : an explicitly live object (its bitmap bit is set)
tonyp@1823 666 // > : an implicitly live object (over tams)
tonyp@1823 667 // O : an object outside the G1 heap (typically: in the perm gen)
tonyp@1823 668 // NOT : a reference field whose referent is not live
tonyp@1823 669 // AND MARKED : indicates that an object is both explicitly and
tonyp@1823 670 // implicitly live (it should be one or the other, not both)
tonyp@1823 671 void print_reachable(const char* str,
tonyp@1823 672 bool use_prev_marking, bool all) PRODUCT_RETURN;
ysr@777 673
ysr@777 674 // Clear the next marking bitmap (will be called concurrently).
ysr@777 675 void clearNextBitmap();
ysr@777 676
ysr@777 677 // main CMS steps and related support
ysr@777 678 void checkpointRootsInitial();
ysr@777 679
ysr@777 680 // These two do the work that needs to be done before and after the
ysr@777 681 // initial root checkpoint. Since this checkpoint can be done at two
ysr@777 682 // different points (i.e. an explicit pause or piggy-backed on a
ysr@777 683 // young collection), then it's nice to be able to easily share the
ysr@777 684 // pre/post code. It might be the case that we can put everything in
ysr@777 685 // the post method. TP
ysr@777 686 void checkpointRootsInitialPre();
ysr@777 687 void checkpointRootsInitialPost();
ysr@777 688
ysr@777 689 // Do concurrent phase of marking, to a tentative transitive closure.
ysr@777 690 void markFromRoots();
ysr@777 691
ysr@777 692 // Process all unprocessed SATB buffers. It is called at the
ysr@777 693 // beginning of an evacuation pause.
ysr@777 694 void drainAllSATBBuffers();
ysr@777 695
ysr@777 696 void checkpointRootsFinal(bool clear_all_soft_refs);
ysr@777 697 void checkpointRootsFinalWork();
ysr@777 698 void calcDesiredRegions();
ysr@777 699 void cleanup();
ysr@777 700 void completeCleanup();
ysr@777 701
ysr@777 702 // Mark in the previous bitmap. NB: this is usually read-only, so use
ysr@777 703 // this carefully!
ysr@777 704 void markPrev(oop p);
ysr@777 705 void clear(oop p);
ysr@777 706 // Clears marks for all objects in the given range, for both prev and
ysr@777 707 // next bitmaps. NB: the previous bitmap is usually read-only, so use
ysr@777 708 // this carefully!
ysr@777 709 void clearRangeBothMaps(MemRegion mr);
ysr@777 710
ysr@777 711 // Record the current top of the mark and region stacks; a
ysr@777 712 // subsequent oops_do() on the mark stack and
ysr@777 713 // invalidate_entries_into_cset() on the region stack will iterate
ysr@777 714 // only over indices valid at the time of this call.
ysr@777 715 void set_oops_do_bound() {
ysr@777 716 _markStack.set_oops_do_bound();
ysr@777 717 _regionStack.set_oops_do_bound();
ysr@777 718 }
ysr@777 719 // Iterate over the oops in the mark stack and all local queues. It
ysr@777 720 // also calls invalidate_entries_into_cset() on the region stack.
ysr@777 721 void oops_do(OopClosure* f);
ysr@777 722 // It is called at the end of an evacuation pause during marking so
ysr@777 723 // that CM is notified of where the new end of the heap is. It
ysr@777 724 // doesn't do anything if concurrent_marking_in_progress() is false,
ysr@777 725 // unless the force parameter is true.
ysr@777 726 void update_g1_committed(bool force = false);
ysr@777 727
ysr@777 728 void complete_marking_in_collection_set();
ysr@777 729
ysr@777 730 // It indicates that a new collection set is being chosen.
ysr@777 731 void newCSet();
ysr@777 732 // It registers a collection set heap region with CM. This is used
ysr@777 733 // to determine whether any heap regions are located above the finger.
ysr@777 734 void registerCSetRegion(HeapRegion* hr);
ysr@777 735
johnc@1829 736 // Registers the maximum region-end associated with a set of
johnc@1829 737 // regions with CM. Again this is used to determine whether any
johnc@1829 738 // heap regions are located above the finger.
johnc@1829 739 void register_collection_set_finger(HeapWord* max_finger) {
johnc@1829 740 // max_finger is the highest heap region end of the regions currently
johnc@1829 741 // contained in the collection set. If this value is larger than
johnc@1829 742 // _min_finger then we need to gray objects.
johnc@1829 743 // This routine is like registerCSetRegion but for an entire
johnc@1829 744 // collection of regions.
johnc@1829 745 if (max_finger > _min_finger)
johnc@1829 746 _should_gray_objects = true;
johnc@1829 747 }
johnc@1829 748
ysr@777 749 // Returns "true" if at least one mark has been completed.
ysr@777 750 bool at_least_one_mark_complete() { return _at_least_one_mark_complete; }
ysr@777 751
ysr@777 752 bool isMarked(oop p) const {
ysr@777 753 assert(p != NULL && p->is_oop(), "expected an oop");
ysr@777 754 HeapWord* addr = (HeapWord*)p;
ysr@777 755 assert(addr >= _nextMarkBitMap->startWord() ||
ysr@777 756 addr < _nextMarkBitMap->endWord(), "in a region");
ysr@777 757
ysr@777 758 return _nextMarkBitMap->isMarked(addr);
ysr@777 759 }
ysr@777 760
ysr@777 761 inline bool not_yet_marked(oop p) const;
ysr@777 762
ysr@777 763 // XXX Debug code
ysr@777 764 bool containing_card_is_marked(void* p);
ysr@777 765 bool containing_cards_are_marked(void* start, void* last);
ysr@777 766
ysr@777 767 bool isPrevMarked(oop p) const {
ysr@777 768 assert(p != NULL && p->is_oop(), "expected an oop");
ysr@777 769 HeapWord* addr = (HeapWord*)p;
ysr@777 770 assert(addr >= _prevMarkBitMap->startWord() ||
ysr@777 771 addr < _prevMarkBitMap->endWord(), "in a region");
ysr@777 772
ysr@777 773 return _prevMarkBitMap->isMarked(addr);
ysr@777 774 }
ysr@777 775
ysr@777 776 inline bool do_yield_check(int worker_i = 0);
ysr@777 777 inline bool should_yield();
ysr@777 778
ysr@777 779 // Called to abort the marking cycle after a Full GC takes palce.
ysr@777 780 void abort();
ysr@777 781
ysr@777 782 // This prints the global/local fingers. It is used for debugging.
ysr@777 783 NOT_PRODUCT(void print_finger();)
ysr@777 784
ysr@777 785 void print_summary_info();
ysr@777 786
tonyp@1454 787 void print_worker_threads_on(outputStream* st) const;
tonyp@1454 788
ysr@777 789 // The following indicate whether a given verbose level has been
ysr@777 790 // set. Notice that anything above stats is conditional to
ysr@777 791 // _MARKING_VERBOSE_ having been set to 1
ysr@777 792 bool verbose_stats()
ysr@777 793 { return _verbose_level >= stats_verbose; }
ysr@777 794 bool verbose_low()
ysr@777 795 { return _MARKING_VERBOSE_ && _verbose_level >= low_verbose; }
ysr@777 796 bool verbose_medium()
ysr@777 797 { return _MARKING_VERBOSE_ && _verbose_level >= medium_verbose; }
ysr@777 798 bool verbose_high()
ysr@777 799 { return _MARKING_VERBOSE_ && _verbose_level >= high_verbose; }
ysr@777 800 };
ysr@777 801
ysr@777 802 // A class representing a marking task.
ysr@777 803 class CMTask : public TerminatorTerminator {
ysr@777 804 private:
ysr@777 805 enum PrivateConstants {
ysr@777 806 // the regular clock call is called once the scanned words reaches
ysr@777 807 // this limit
ysr@777 808 words_scanned_period = 12*1024,
ysr@777 809 // the regular clock call is called once the number of visited
ysr@777 810 // references reaches this limit
ysr@777 811 refs_reached_period = 384,
ysr@777 812 // initial value for the hash seed, used in the work stealing code
ysr@777 813 init_hash_seed = 17,
ysr@777 814 // how many entries will be transferred between global stack and
ysr@777 815 // local queues
ysr@777 816 global_stack_transfer_size = 16
ysr@777 817 };
ysr@777 818
ysr@777 819 int _task_id;
ysr@777 820 G1CollectedHeap* _g1h;
ysr@777 821 ConcurrentMark* _cm;
ysr@777 822 CMBitMap* _nextMarkBitMap;
ysr@777 823 // the task queue of this task
ysr@777 824 CMTaskQueue* _task_queue;
ysr@1280 825 private:
ysr@777 826 // the task queue set---needed for stealing
ysr@777 827 CMTaskQueueSet* _task_queues;
ysr@777 828 // indicates whether the task has been claimed---this is only for
ysr@777 829 // debugging purposes
ysr@777 830 bool _claimed;
ysr@777 831
ysr@777 832 // number of calls to this task
ysr@777 833 int _calls;
ysr@777 834
ysr@777 835 // when the virtual timer reaches this time, the marking step should
ysr@777 836 // exit
ysr@777 837 double _time_target_ms;
ysr@777 838 // the start time of the current marking step
ysr@777 839 double _start_time_ms;
ysr@777 840
ysr@777 841 // the oop closure used for iterations over oops
ysr@777 842 OopClosure* _oop_closure;
ysr@777 843
ysr@777 844 // the region this task is scanning, NULL if we're not scanning any
ysr@777 845 HeapRegion* _curr_region;
ysr@777 846 // the local finger of this task, NULL if we're not scanning a region
ysr@777 847 HeapWord* _finger;
ysr@777 848 // limit of the region this task is scanning, NULL if we're not scanning one
ysr@777 849 HeapWord* _region_limit;
ysr@777 850
ysr@777 851 // This is used only when we scan regions popped from the region
ysr@777 852 // stack. It records what the last object on such a region we
ysr@777 853 // scanned was. It is used to ensure that, if we abort region
ysr@777 854 // iteration, we do not rescan the first part of the region. This
ysr@777 855 // should be NULL when we're not scanning a region from the region
ysr@777 856 // stack.
ysr@777 857 HeapWord* _region_finger;
ysr@777 858
ysr@777 859 // the number of words this task has scanned
ysr@777 860 size_t _words_scanned;
ysr@777 861 // When _words_scanned reaches this limit, the regular clock is
ysr@777 862 // called. Notice that this might be decreased under certain
ysr@777 863 // circumstances (i.e. when we believe that we did an expensive
ysr@777 864 // operation).
ysr@777 865 size_t _words_scanned_limit;
ysr@777 866 // the initial value of _words_scanned_limit (i.e. what it was
ysr@777 867 // before it was decreased).
ysr@777 868 size_t _real_words_scanned_limit;
ysr@777 869
ysr@777 870 // the number of references this task has visited
ysr@777 871 size_t _refs_reached;
ysr@777 872 // When _refs_reached reaches this limit, the regular clock is
ysr@777 873 // called. Notice this this might be decreased under certain
ysr@777 874 // circumstances (i.e. when we believe that we did an expensive
ysr@777 875 // operation).
ysr@777 876 size_t _refs_reached_limit;
ysr@777 877 // the initial value of _refs_reached_limit (i.e. what it was before
ysr@777 878 // it was decreased).
ysr@777 879 size_t _real_refs_reached_limit;
ysr@777 880
ysr@777 881 // used by the work stealing stuff
ysr@777 882 int _hash_seed;
ysr@777 883 // if this is true, then the task has aborted for some reason
ysr@777 884 bool _has_aborted;
ysr@777 885 // set when the task aborts because it has met its time quota
ysr@777 886 bool _has_aborted_timed_out;
ysr@777 887 // true when we're draining SATB buffers; this avoids the task
ysr@777 888 // aborting due to SATB buffers being available (as we're already
ysr@777 889 // dealing with them)
ysr@777 890 bool _draining_satb_buffers;
ysr@777 891
ysr@777 892 // number sequence of past step times
ysr@777 893 NumberSeq _step_times_ms;
ysr@777 894 // elapsed time of this task
ysr@777 895 double _elapsed_time_ms;
ysr@777 896 // termination time of this task
ysr@777 897 double _termination_time_ms;
ysr@777 898 // when this task got into the termination protocol
ysr@777 899 double _termination_start_time_ms;
ysr@777 900
ysr@777 901 // true when the task is during a concurrent phase, false when it is
ysr@777 902 // in the remark phase (so, in the latter case, we do not have to
ysr@777 903 // check all the things that we have to check during the concurrent
ysr@777 904 // phase, i.e. SATB buffer availability...)
ysr@777 905 bool _concurrent;
ysr@777 906
ysr@777 907 TruncatedSeq _marking_step_diffs_ms;
ysr@777 908
ysr@777 909 // LOTS of statistics related with this task
ysr@777 910 #if _MARKING_STATS_
ysr@777 911 NumberSeq _all_clock_intervals_ms;
ysr@777 912 double _interval_start_time_ms;
ysr@777 913
ysr@777 914 int _aborted;
ysr@777 915 int _aborted_overflow;
ysr@777 916 int _aborted_cm_aborted;
ysr@777 917 int _aborted_yield;
ysr@777 918 int _aborted_timed_out;
ysr@777 919 int _aborted_satb;
ysr@777 920 int _aborted_termination;
ysr@777 921
ysr@777 922 int _steal_attempts;
ysr@777 923 int _steals;
ysr@777 924
ysr@777 925 int _clock_due_to_marking;
ysr@777 926 int _clock_due_to_scanning;
ysr@777 927
ysr@777 928 int _local_pushes;
ysr@777 929 int _local_pops;
ysr@777 930 int _local_max_size;
ysr@777 931 int _objs_scanned;
ysr@777 932
ysr@777 933 int _global_pushes;
ysr@777 934 int _global_pops;
ysr@777 935 int _global_max_size;
ysr@777 936
ysr@777 937 int _global_transfers_to;
ysr@777 938 int _global_transfers_from;
ysr@777 939
ysr@777 940 int _region_stack_pops;
ysr@777 941
ysr@777 942 int _regions_claimed;
ysr@777 943 int _objs_found_on_bitmap;
ysr@777 944
ysr@777 945 int _satb_buffers_processed;
ysr@777 946 #endif // _MARKING_STATS_
ysr@777 947
ysr@777 948 // it updates the local fields after this task has claimed
ysr@777 949 // a new region to scan
ysr@777 950 void setup_for_region(HeapRegion* hr);
ysr@777 951 // it brings up-to-date the limit of the region
ysr@777 952 void update_region_limit();
ysr@777 953 // it resets the local fields after a task has finished scanning a
ysr@777 954 // region
ysr@777 955 void giveup_current_region();
ysr@777 956
ysr@777 957 // called when either the words scanned or the refs visited limit
ysr@777 958 // has been reached
ysr@777 959 void reached_limit();
ysr@777 960 // recalculates the words scanned and refs visited limits
ysr@777 961 void recalculate_limits();
ysr@777 962 // decreases the words scanned and refs visited limits when we reach
ysr@777 963 // an expensive operation
ysr@777 964 void decrease_limits();
ysr@777 965 // it checks whether the words scanned or refs visited reached their
ysr@777 966 // respective limit and calls reached_limit() if they have
ysr@777 967 void check_limits() {
ysr@777 968 if (_words_scanned >= _words_scanned_limit ||
ysr@777 969 _refs_reached >= _refs_reached_limit)
ysr@777 970 reached_limit();
ysr@777 971 }
ysr@777 972 // this is supposed to be called regularly during a marking step as
ysr@777 973 // it checks a bunch of conditions that might cause the marking step
ysr@777 974 // to abort
ysr@777 975 void regular_clock_call();
ysr@777 976 bool concurrent() { return _concurrent; }
ysr@777 977
ysr@777 978 public:
ysr@777 979 // It resets the task; it should be called right at the beginning of
ysr@777 980 // a marking phase.
ysr@777 981 void reset(CMBitMap* _nextMarkBitMap);
ysr@777 982 // it clears all the fields that correspond to a claimed region.
ysr@777 983 void clear_region_fields();
ysr@777 984
ysr@777 985 void set_concurrent(bool concurrent) { _concurrent = concurrent; }
ysr@777 986
ysr@777 987 // The main method of this class which performs a marking step
ysr@777 988 // trying not to exceed the given duration. However, it might exit
ysr@777 989 // prematurely, according to some conditions (i.e. SATB buffers are
ysr@777 990 // available for processing).
ysr@777 991 void do_marking_step(double target_ms);
ysr@777 992
ysr@777 993 // These two calls start and stop the timer
ysr@777 994 void record_start_time() {
ysr@777 995 _elapsed_time_ms = os::elapsedTime() * 1000.0;
ysr@777 996 }
ysr@777 997 void record_end_time() {
ysr@777 998 _elapsed_time_ms = os::elapsedTime() * 1000.0 - _elapsed_time_ms;
ysr@777 999 }
ysr@777 1000
ysr@777 1001 // returns the task ID
ysr@777 1002 int task_id() { return _task_id; }
ysr@777 1003
ysr@777 1004 // From TerminatorTerminator. It determines whether this task should
ysr@777 1005 // exit the termination protocol after it's entered it.
ysr@777 1006 virtual bool should_exit_termination();
ysr@777 1007
ysr@777 1008 HeapWord* finger() { return _finger; }
ysr@777 1009
ysr@777 1010 bool has_aborted() { return _has_aborted; }
ysr@777 1011 void set_has_aborted() { _has_aborted = true; }
ysr@777 1012 void clear_has_aborted() { _has_aborted = false; }
ysr@777 1013 bool claimed() { return _claimed; }
ysr@777 1014
ysr@777 1015 void set_oop_closure(OopClosure* oop_closure) {
ysr@777 1016 _oop_closure = oop_closure;
ysr@777 1017 }
ysr@777 1018
ysr@777 1019 // It grays the object by marking it and, if necessary, pushing it
ysr@777 1020 // on the local queue
ysr@777 1021 void deal_with_reference(oop obj);
ysr@777 1022
ysr@777 1023 // It scans an object and visits its children.
ysr@777 1024 void scan_object(oop obj) {
tonyp@1458 1025 assert(_nextMarkBitMap->isMarked((HeapWord*) obj), "invariant");
ysr@777 1026
ysr@777 1027 if (_cm->verbose_high())
ysr@777 1028 gclog_or_tty->print_cr("[%d] we're scanning object "PTR_FORMAT,
ysr@777 1029 _task_id, (void*) obj);
ysr@777 1030
ysr@777 1031 size_t obj_size = obj->size();
ysr@777 1032 _words_scanned += obj_size;
ysr@777 1033
ysr@777 1034 obj->oop_iterate(_oop_closure);
ysr@777 1035 statsOnly( ++_objs_scanned );
ysr@777 1036 check_limits();
ysr@777 1037 }
ysr@777 1038
ysr@777 1039 // It pushes an object on the local queue.
ysr@777 1040 void push(oop obj);
ysr@777 1041
ysr@777 1042 // These two move entries to/from the global stack.
ysr@777 1043 void move_entries_to_global_stack();
ysr@777 1044 void get_entries_from_global_stack();
ysr@777 1045
ysr@777 1046 // It pops and scans objects from the local queue. If partially is
ysr@777 1047 // true, then it stops when the queue size is of a given limit. If
ysr@777 1048 // partially is false, then it stops when the queue is empty.
ysr@777 1049 void drain_local_queue(bool partially);
ysr@777 1050 // It moves entries from the global stack to the local queue and
ysr@777 1051 // drains the local queue. If partially is true, then it stops when
ysr@777 1052 // both the global stack and the local queue reach a given size. If
ysr@777 1053 // partially if false, it tries to empty them totally.
ysr@777 1054 void drain_global_stack(bool partially);
ysr@777 1055 // It keeps picking SATB buffers and processing them until no SATB
ysr@777 1056 // buffers are available.
ysr@777 1057 void drain_satb_buffers();
ysr@777 1058 // It keeps popping regions from the region stack and processing
ysr@777 1059 // them until the region stack is empty.
ysr@777 1060 void drain_region_stack(BitMapClosure* closure);
ysr@777 1061
ysr@777 1062 // moves the local finger to a new location
ysr@777 1063 inline void move_finger_to(HeapWord* new_finger) {
tonyp@1458 1064 assert(new_finger >= _finger && new_finger < _region_limit, "invariant");
ysr@777 1065 _finger = new_finger;
ysr@777 1066 }
ysr@777 1067
ysr@777 1068 // moves the region finger to a new location
ysr@777 1069 inline void move_region_finger_to(HeapWord* new_finger) {
tonyp@1458 1070 assert(new_finger < _cm->finger(), "invariant");
ysr@777 1071 _region_finger = new_finger;
ysr@777 1072 }
ysr@777 1073
ysr@777 1074 CMTask(int task_num, ConcurrentMark *cm,
ysr@777 1075 CMTaskQueue* task_queue, CMTaskQueueSet* task_queues);
ysr@777 1076
ysr@777 1077 // it prints statistics associated with this task
ysr@777 1078 void print_stats();
ysr@777 1079
ysr@777 1080 #if _MARKING_STATS_
ysr@777 1081 void increase_objs_found_on_bitmap() { ++_objs_found_on_bitmap; }
ysr@777 1082 #endif // _MARKING_STATS_
ysr@777 1083 };

mercurial