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

Tue, 05 Mar 2013 15:36:56 -0800

author
tamao
date
Tue, 05 Mar 2013 15:36:56 -0800
changeset 4733
9def4075da6d
parent 4555
f90b9bceb8e5
child 4787
fa08949fe0cb
permissions
-rw-r--r--

8008079: G1: Add nextObject routine to CMBitMapRO and replace nextWord
Summary: Update the task local finger to the start of the next object when marking aborts, in order to avoid the redundant scanning of all 0's when the marking task restarts, if otherwise updating to the next word. In addition, reuse the routine nextObject() in routine iterate().
Reviewed-by: johnc, ysr
Contributed-by: tamao <tao.mao@oracle.com>

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

mercurial