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

Sat, 06 Oct 2012 01:17:44 -0700

author
johnc
date
Sat, 06 Oct 2012 01:17:44 -0700
changeset 4173
8a5ea0a9ccc4
parent 4123
988bf00cc564
child 4333
442f942757c0
permissions
-rw-r--r--

7127708: G1: change task num types from int to uint in concurrent mark
Summary: Change the type of various task num fields, parameters etc to unsigned and rename them to be more consistent with the other collectors. Code changes were also reviewed by Vitaly Davidovich.
Reviewed-by: johnc
Contributed-by: Kaushik Srenevasan <kaushik@twitter.com>

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

mercurial