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

Wed, 25 Jan 2012 12:58:23 -0500

author
tonyp
date
Wed, 25 Jan 2012 12:58:23 -0500
changeset 3464
eff609af17d7
parent 3463
d30fa85f9994
child 3691
2a0172480595
permissions
-rw-r--r--

7127706: G1: re-enable survivors during the initial-mark pause
Summary: Re-enable survivors during the initial-mark pause. Afterwards, the concurrent marking threads have to scan them and mark everything reachable from them. The next GC will have to wait for the survivors to be scanned.
Reviewed-by: brutisso, johnc

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

mercurial