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

Thu, 20 Sep 2012 09:52:56 -0700

author
johnc
date
Thu, 20 Sep 2012 09:52:56 -0700
changeset 4067
b2ef234911c9
parent 4063
9646b7ff4d14
child 4130
2e6857353b2c
permissions
-rw-r--r--

7190666: G1: assert(_unused == 0) failed: Inconsistency in PLAB stats
Summary: Reset the fields in ParGCAllocBuffer, that are used for accumulating values for the ResizePLAB sensors in PLABStats, to zero after flushing the values to the PLABStats fields. Flush PLABStats values only when retiring the final allocation buffers prior to disposing of a G1ParScanThreadState object, rather than when retiring every allocation buffer.
Reviewed-by: jwilhelm, jmasa, ysr

ysr@777 1 /*
johnc@3412 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_G1COLLECTEDHEAP_HPP
stefank@2314 26 #define SHARE_VM_GC_IMPLEMENTATION_G1_G1COLLECTEDHEAP_HPP
stefank@2314 27
stefank@2314 28 #include "gc_implementation/g1/concurrentMark.hpp"
tonyp@2715 29 #include "gc_implementation/g1/g1AllocRegion.hpp"
tonyp@2975 30 #include "gc_implementation/g1/g1HRPrinter.hpp"
stefank@2314 31 #include "gc_implementation/g1/g1RemSet.hpp"
jmasa@2821 32 #include "gc_implementation/g1/g1MonitoringSupport.hpp"
tonyp@2963 33 #include "gc_implementation/g1/heapRegionSeq.hpp"
tonyp@2472 34 #include "gc_implementation/g1/heapRegionSets.hpp"
jmasa@2821 35 #include "gc_implementation/shared/hSpaceCounters.hpp"
johnc@3982 36 #include "gc_implementation/shared/parGCAllocBuffer.hpp"
stefank@2314 37 #include "memory/barrierSet.hpp"
stefank@2314 38 #include "memory/memRegion.hpp"
stefank@2314 39 #include "memory/sharedHeap.hpp"
stefank@2314 40
ysr@777 41 // A "G1CollectedHeap" is an implementation of a java heap for HotSpot.
ysr@777 42 // It uses the "Garbage First" heap organization and algorithm, which
ysr@777 43 // may combine concurrent marking with parallel, incremental compaction of
ysr@777 44 // heap subsets that will yield large amounts of garbage.
ysr@777 45
ysr@777 46 class HeapRegion;
tonyp@2493 47 class HRRSCleanupTask;
ysr@777 48 class GenerationSpec;
ysr@777 49 class OopsInHeapRegionClosure;
coleenp@4037 50 class G1KlassScanClosure;
ysr@777 51 class G1ScanHeapEvacClosure;
ysr@777 52 class ObjectClosure;
ysr@777 53 class SpaceClosure;
ysr@777 54 class CompactibleSpaceClosure;
ysr@777 55 class Space;
ysr@777 56 class G1CollectorPolicy;
ysr@777 57 class GenRemSet;
ysr@777 58 class G1RemSet;
ysr@777 59 class HeapRegionRemSetIterator;
ysr@777 60 class ConcurrentMark;
ysr@777 61 class ConcurrentMarkThread;
ysr@777 62 class ConcurrentG1Refine;
jmasa@2821 63 class GenerationCounters;
ysr@777 64
zgu@3900 65 typedef OverflowTaskQueue<StarTask, mtGC> RefToScanQueue;
zgu@3900 66 typedef GenericTaskQueueSet<RefToScanQueue, mtGC> RefToScanQueueSet;
ysr@777 67
johnc@1242 68 typedef int RegionIdx_t; // needs to hold [ 0..max_regions() )
johnc@1242 69 typedef int CardIdx_t; // needs to hold [ 0..CardsPerRegion )
johnc@1242 70
ysr@777 71 enum GCAllocPurpose {
ysr@777 72 GCAllocForTenured,
ysr@777 73 GCAllocForSurvived,
ysr@777 74 GCAllocPurposeCount
ysr@777 75 };
ysr@777 76
zgu@3900 77 class YoungList : public CHeapObj<mtGC> {
ysr@777 78 private:
ysr@777 79 G1CollectedHeap* _g1h;
ysr@777 80
ysr@777 81 HeapRegion* _head;
ysr@777 82
johnc@1829 83 HeapRegion* _survivor_head;
johnc@1829 84 HeapRegion* _survivor_tail;
johnc@1829 85
johnc@1829 86 HeapRegion* _curr;
johnc@1829 87
tonyp@3713 88 uint _length;
tonyp@3713 89 uint _survivor_length;
ysr@777 90
ysr@777 91 size_t _last_sampled_rs_lengths;
ysr@777 92 size_t _sampled_rs_lengths;
ysr@777 93
johnc@1829 94 void empty_list(HeapRegion* list);
ysr@777 95
ysr@777 96 public:
ysr@777 97 YoungList(G1CollectedHeap* g1h);
ysr@777 98
johnc@1829 99 void push_region(HeapRegion* hr);
johnc@1829 100 void add_survivor_region(HeapRegion* hr);
johnc@1829 101
johnc@1829 102 void empty_list();
johnc@1829 103 bool is_empty() { return _length == 0; }
tonyp@3713 104 uint length() { return _length; }
tonyp@3713 105 uint survivor_length() { return _survivor_length; }
ysr@777 106
tonyp@2961 107 // Currently we do not keep track of the used byte sum for the
tonyp@2961 108 // young list and the survivors and it'd be quite a lot of work to
tonyp@2961 109 // do so. When we'll eventually replace the young list with
tonyp@2961 110 // instances of HeapRegionLinkedList we'll get that for free. So,
tonyp@2961 111 // we'll report the more accurate information then.
tonyp@2961 112 size_t eden_used_bytes() {
tonyp@2961 113 assert(length() >= survivor_length(), "invariant");
tonyp@3713 114 return (size_t) (length() - survivor_length()) * HeapRegion::GrainBytes;
tonyp@2961 115 }
tonyp@2961 116 size_t survivor_used_bytes() {
tonyp@3713 117 return (size_t) survivor_length() * HeapRegion::GrainBytes;
tonyp@2961 118 }
tonyp@2961 119
ysr@777 120 void rs_length_sampling_init();
ysr@777 121 bool rs_length_sampling_more();
ysr@777 122 void rs_length_sampling_next();
ysr@777 123
ysr@777 124 void reset_sampled_info() {
ysr@777 125 _last_sampled_rs_lengths = 0;
ysr@777 126 }
ysr@777 127 size_t sampled_rs_lengths() { return _last_sampled_rs_lengths; }
ysr@777 128
ysr@777 129 // for development purposes
ysr@777 130 void reset_auxilary_lists();
johnc@1829 131 void clear() { _head = NULL; _length = 0; }
johnc@1829 132
johnc@1829 133 void clear_survivors() {
johnc@1829 134 _survivor_head = NULL;
johnc@1829 135 _survivor_tail = NULL;
johnc@1829 136 _survivor_length = 0;
johnc@1829 137 }
johnc@1829 138
ysr@777 139 HeapRegion* first_region() { return _head; }
ysr@777 140 HeapRegion* first_survivor_region() { return _survivor_head; }
apetrusenko@980 141 HeapRegion* last_survivor_region() { return _survivor_tail; }
ysr@777 142
ysr@777 143 // debugging
ysr@777 144 bool check_list_well_formed();
johnc@1829 145 bool check_list_empty(bool check_sample = true);
ysr@777 146 void print();
ysr@777 147 };
ysr@777 148
tonyp@2715 149 class MutatorAllocRegion : public G1AllocRegion {
tonyp@2715 150 protected:
tonyp@2715 151 virtual HeapRegion* allocate_new_region(size_t word_size, bool force);
tonyp@2715 152 virtual void retire_region(HeapRegion* alloc_region, size_t allocated_bytes);
tonyp@2715 153 public:
tonyp@2715 154 MutatorAllocRegion()
tonyp@2715 155 : G1AllocRegion("Mutator Alloc Region", false /* bot_updates */) { }
tonyp@2715 156 };
tonyp@2715 157
johnc@3175 158 // The G1 STW is alive closure.
johnc@3175 159 // An instance is embedded into the G1CH and used as the
johnc@3175 160 // (optional) _is_alive_non_header closure in the STW
johnc@3175 161 // reference processor. It is also extensively used during
johnc@3175 162 // refence processing during STW evacuation pauses.
johnc@3175 163 class G1STWIsAliveClosure: public BoolObjectClosure {
johnc@3175 164 G1CollectedHeap* _g1;
johnc@3175 165 public:
johnc@3175 166 G1STWIsAliveClosure(G1CollectedHeap* g1) : _g1(g1) {}
johnc@3175 167 void do_object(oop p) { assert(false, "Do not call."); }
johnc@3175 168 bool do_object_b(oop p);
johnc@3175 169 };
johnc@3175 170
tonyp@3028 171 class SurvivorGCAllocRegion : public G1AllocRegion {
tonyp@3028 172 protected:
tonyp@3028 173 virtual HeapRegion* allocate_new_region(size_t word_size, bool force);
tonyp@3028 174 virtual void retire_region(HeapRegion* alloc_region, size_t allocated_bytes);
tonyp@3028 175 public:
tonyp@3028 176 SurvivorGCAllocRegion()
tonyp@3028 177 : G1AllocRegion("Survivor GC Alloc Region", false /* bot_updates */) { }
tonyp@3028 178 };
tonyp@3028 179
tonyp@3028 180 class OldGCAllocRegion : public G1AllocRegion {
tonyp@3028 181 protected:
tonyp@3028 182 virtual HeapRegion* allocate_new_region(size_t word_size, bool force);
tonyp@3028 183 virtual void retire_region(HeapRegion* alloc_region, size_t allocated_bytes);
tonyp@3028 184 public:
tonyp@3028 185 OldGCAllocRegion()
tonyp@3028 186 : G1AllocRegion("Old GC Alloc Region", true /* bot_updates */) { }
tonyp@3028 187 };
tonyp@3028 188
ysr@777 189 class RefineCardTableEntryClosure;
johnc@3175 190
ysr@777 191 class G1CollectedHeap : public SharedHeap {
ysr@777 192 friend class VM_G1CollectForAllocation;
ysr@777 193 friend class VM_G1CollectFull;
ysr@777 194 friend class VM_G1IncCollectionPause;
ysr@777 195 friend class VMStructs;
tonyp@2715 196 friend class MutatorAllocRegion;
tonyp@3028 197 friend class SurvivorGCAllocRegion;
tonyp@3028 198 friend class OldGCAllocRegion;
ysr@777 199
ysr@777 200 // Closures used in implementation.
brutisso@3690 201 template <bool do_gen_barrier, G1Barrier barrier, bool do_mark_object>
brutisso@3690 202 friend class G1ParCopyClosure;
ysr@777 203 friend class G1IsAliveClosure;
ysr@777 204 friend class G1EvacuateFollowersClosure;
ysr@777 205 friend class G1ParScanThreadState;
ysr@777 206 friend class G1ParScanClosureSuper;
ysr@777 207 friend class G1ParEvacuateFollowersClosure;
ysr@777 208 friend class G1ParTask;
ysr@777 209 friend class G1FreeGarbageRegionClosure;
ysr@777 210 friend class RefineCardTableEntryClosure;
ysr@777 211 friend class G1PrepareCompactClosure;
ysr@777 212 friend class RegionSorter;
tonyp@2472 213 friend class RegionResetter;
ysr@777 214 friend class CountRCClosure;
ysr@777 215 friend class EvacPopObjClosure;
apetrusenko@1231 216 friend class G1ParCleanupCTTask;
ysr@777 217
ysr@777 218 // Other related classes.
ysr@777 219 friend class G1MarkSweep;
ysr@777 220
ysr@777 221 private:
ysr@777 222 // The one and only G1CollectedHeap, so static functions can find it.
ysr@777 223 static G1CollectedHeap* _g1h;
ysr@777 224
tonyp@1377 225 static size_t _humongous_object_threshold_in_words;
tonyp@1377 226
coleenp@4037 227 // Storage for the G1 heap.
ysr@777 228 VirtualSpace _g1_storage;
ysr@777 229 MemRegion _g1_reserved;
ysr@777 230
ysr@777 231 // The part of _g1_storage that is currently committed.
ysr@777 232 MemRegion _g1_committed;
ysr@777 233
tonyp@2472 234 // The master free list. It will satisfy all new region allocations.
tonyp@2472 235 MasterFreeRegionList _free_list;
tonyp@2472 236
tonyp@2472 237 // The secondary free list which contains regions that have been
tonyp@2472 238 // freed up during the cleanup process. This will be appended to the
tonyp@2472 239 // master free list when appropriate.
tonyp@2472 240 SecondaryFreeRegionList _secondary_free_list;
tonyp@2472 241
tonyp@3268 242 // It keeps track of the old regions.
tonyp@3268 243 MasterOldRegionSet _old_set;
tonyp@3268 244
tonyp@2472 245 // It keeps track of the humongous regions.
tonyp@2472 246 MasterHumongousRegionSet _humongous_set;
ysr@777 247
ysr@777 248 // The number of regions we could create by expansion.
tonyp@3713 249 uint _expansion_regions;
ysr@777 250
ysr@777 251 // The block offset table for the G1 heap.
ysr@777 252 G1BlockOffsetSharedArray* _bot_shared;
ysr@777 253
tonyp@3268 254 // Tears down the region sets / lists so that they are empty and the
tonyp@3268 255 // regions on the heap do not belong to a region set / list. The
tonyp@3268 256 // only exception is the humongous set which we leave unaltered. If
tonyp@3268 257 // free_list_only is true, it will only tear down the master free
tonyp@3268 258 // list. It is called before a Full GC (free_list_only == false) or
tonyp@3268 259 // before heap shrinking (free_list_only == true).
tonyp@3268 260 void tear_down_region_sets(bool free_list_only);
tonyp@3268 261
tonyp@3268 262 // Rebuilds the region sets / lists so that they are repopulated to
tonyp@3268 263 // reflect the contents of the heap. The only exception is the
tonyp@3268 264 // humongous set which was not torn down in the first place. If
tonyp@3268 265 // free_list_only is true, it will only rebuild the master free
tonyp@3268 266 // list. It is called after a Full GC (free_list_only == false) or
tonyp@3268 267 // after heap shrinking (free_list_only == true).
tonyp@3268 268 void rebuild_region_sets(bool free_list_only);
ysr@777 269
ysr@777 270 // The sequence of all heap regions in the heap.
tonyp@2963 271 HeapRegionSeq _hrs;
ysr@777 272
tonyp@2715 273 // Alloc region used to satisfy mutator allocation requests.
tonyp@2715 274 MutatorAllocRegion _mutator_alloc_region;
ysr@777 275
tonyp@3028 276 // Alloc region used to satisfy allocation requests by the GC for
tonyp@3028 277 // survivor objects.
tonyp@3028 278 SurvivorGCAllocRegion _survivor_gc_alloc_region;
tonyp@3028 279
johnc@3982 280 // PLAB sizing policy for survivors.
johnc@3982 281 PLABStats _survivor_plab_stats;
johnc@3982 282
tonyp@3028 283 // Alloc region used to satisfy allocation requests by the GC for
tonyp@3028 284 // old objects.
tonyp@3028 285 OldGCAllocRegion _old_gc_alloc_region;
tonyp@3028 286
johnc@3982 287 // PLAB sizing policy for tenured objects.
johnc@3982 288 PLABStats _old_plab_stats;
johnc@3982 289
johnc@3982 290 PLABStats* stats_for_purpose(GCAllocPurpose purpose) {
johnc@3982 291 PLABStats* stats = NULL;
johnc@3982 292
johnc@3982 293 switch (purpose) {
johnc@3982 294 case GCAllocForSurvived:
johnc@3982 295 stats = &_survivor_plab_stats;
johnc@3982 296 break;
johnc@3982 297 case GCAllocForTenured:
johnc@3982 298 stats = &_old_plab_stats;
johnc@3982 299 break;
johnc@3982 300 default:
johnc@3982 301 assert(false, "unrecognized GCAllocPurpose");
johnc@3982 302 }
johnc@3982 303
johnc@3982 304 return stats;
johnc@3982 305 }
johnc@3982 306
tonyp@3028 307 // The last old region we allocated to during the last GC.
tonyp@3028 308 // Typically, it is not full so we should re-use it during the next GC.
tonyp@3028 309 HeapRegion* _retained_old_gc_alloc_region;
tonyp@3028 310
tonyp@3410 311 // It specifies whether we should attempt to expand the heap after a
tonyp@3410 312 // region allocation failure. If heap expansion fails we set this to
tonyp@3410 313 // false so that we don't re-attempt the heap expansion (it's likely
tonyp@3410 314 // that subsequent expansion attempts will also fail if one fails).
tonyp@3410 315 // Currently, it is only consulted during GC and it's reset at the
tonyp@3410 316 // start of each GC.
tonyp@3410 317 bool _expand_heap_after_alloc_failure;
tonyp@3410 318
tonyp@2715 319 // It resets the mutator alloc region before new allocations can take place.
tonyp@2715 320 void init_mutator_alloc_region();
tonyp@2715 321
tonyp@2715 322 // It releases the mutator alloc region.
tonyp@2715 323 void release_mutator_alloc_region();
tonyp@2715 324
tonyp@3028 325 // It initializes the GC alloc regions at the start of a GC.
tonyp@3028 326 void init_gc_alloc_regions();
tonyp@3028 327
tonyp@3028 328 // It releases the GC alloc regions at the end of a GC.
tonyp@3028 329 void release_gc_alloc_regions();
tonyp@3028 330
tonyp@3028 331 // It does any cleanup that needs to be done on the GC alloc regions
tonyp@3028 332 // before a Full GC.
tonyp@1071 333 void abandon_gc_alloc_regions();
ysr@777 334
jmasa@2821 335 // Helper for monitoring and management support.
jmasa@2821 336 G1MonitoringSupport* _g1mm;
jmasa@2821 337
apetrusenko@1826 338 // Determines PLAB size for a particular allocation purpose.
johnc@3982 339 size_t desired_plab_sz(GCAllocPurpose purpose);
apetrusenko@1826 340
ysr@777 341 // Outside of GC pauses, the number of bytes used in all regions other
ysr@777 342 // than the current allocation region.
ysr@777 343 size_t _summary_bytes_used;
ysr@777 344
tonyp@961 345 // This is used for a quick test on whether a reference points into
tonyp@961 346 // the collection set or not. Basically, we have an array, with one
tonyp@961 347 // byte per region, and that byte denotes whether the corresponding
tonyp@961 348 // region is in the collection set or not. The entry corresponding
tonyp@961 349 // the bottom of the heap, i.e., region 0, is pointed to by
tonyp@961 350 // _in_cset_fast_test_base. The _in_cset_fast_test field has been
tonyp@961 351 // biased so that it actually points to address 0 of the address
tonyp@961 352 // space, to make the test as fast as possible (we can simply shift
tonyp@961 353 // the address to address into it, instead of having to subtract the
tonyp@961 354 // bottom of the heap from the address before shifting it; basically
tonyp@961 355 // it works in the same way the card table works).
tonyp@961 356 bool* _in_cset_fast_test;
tonyp@961 357
tonyp@961 358 // The allocated array used for the fast test on whether a reference
tonyp@961 359 // points into the collection set or not. This field is also used to
tonyp@961 360 // free the array.
tonyp@961 361 bool* _in_cset_fast_test_base;
tonyp@961 362
tonyp@961 363 // The length of the _in_cset_fast_test_base array.
tonyp@3713 364 uint _in_cset_fast_test_length;
tonyp@961 365
iveresov@788 366 volatile unsigned _gc_time_stamp;
ysr@777 367
ysr@777 368 size_t* _surviving_young_words;
ysr@777 369
tonyp@2975 370 G1HRPrinter _hr_printer;
tonyp@2975 371
ysr@777 372 void setup_surviving_young_words();
ysr@777 373 void update_surviving_young_words(size_t* surv_young_words);
ysr@777 374 void cleanup_surviving_young_words();
ysr@777 375
tonyp@2011 376 // It decides whether an explicit GC should start a concurrent cycle
tonyp@2011 377 // instead of doing a STW GC. Currently, a concurrent cycle is
tonyp@2011 378 // explicitly started if:
tonyp@2011 379 // (a) cause == _gc_locker and +GCLockerInvokesConcurrent, or
tonyp@2011 380 // (b) cause == _java_lang_system_gc and +ExplicitGCInvokesConcurrent.
brutisso@3456 381 // (c) cause == _g1_humongous_allocation
tonyp@2011 382 bool should_do_concurrent_full_gc(GCCause::Cause cause);
tonyp@2011 383
brutisso@3823 384 // Keeps track of how many "old marking cycles" (i.e., Full GCs or
brutisso@3823 385 // concurrent cycles) we have started.
brutisso@3823 386 volatile unsigned int _old_marking_cycles_started;
brutisso@3823 387
brutisso@3823 388 // Keeps track of how many "old marking cycles" (i.e., Full GCs or
brutisso@3823 389 // concurrent cycles) we have completed.
brutisso@3823 390 volatile unsigned int _old_marking_cycles_completed;
tonyp@2011 391
tonyp@2817 392 // This is a non-product method that is helpful for testing. It is
tonyp@2817 393 // called at the end of a GC and artificially expands the heap by
tonyp@2817 394 // allocating a number of dead regions. This way we can induce very
tonyp@2817 395 // frequent marking cycles and stress the cleanup / concurrent
tonyp@2817 396 // cleanup code more (as all the regions that will be allocated by
tonyp@2817 397 // this method will be found dead by the marking cycle).
tonyp@2817 398 void allocate_dummy_regions() PRODUCT_RETURN;
tonyp@2817 399
tonyp@3957 400 // Clear RSets after a compaction. It also resets the GC time stamps.
tonyp@3957 401 void clear_rsets_post_compaction();
tonyp@3957 402
tonyp@3957 403 // If the HR printer is active, dump the state of the regions in the
tonyp@3957 404 // heap after a compaction.
tonyp@3957 405 void print_hrs_post_compaction();
tonyp@3957 406
brutisso@4015 407 double verify(bool guard, const char* msg);
brutisso@4015 408 void verify_before_gc();
brutisso@4015 409 void verify_after_gc();
brutisso@4015 410
brutisso@4063 411 void log_gc_header();
brutisso@4063 412 void log_gc_footer(double pause_time_sec);
brutisso@4063 413
tonyp@2315 414 // These are macros so that, if the assert fires, we get the correct
tonyp@2315 415 // line number, file, etc.
tonyp@2315 416
tonyp@2643 417 #define heap_locking_asserts_err_msg(_extra_message_) \
tonyp@2472 418 err_msg("%s : Heap_lock locked: %s, at safepoint: %s, is VM thread: %s", \
tonyp@2643 419 (_extra_message_), \
tonyp@2472 420 BOOL_TO_STR(Heap_lock->owned_by_self()), \
tonyp@2472 421 BOOL_TO_STR(SafepointSynchronize::is_at_safepoint()), \
tonyp@2472 422 BOOL_TO_STR(Thread::current()->is_VM_thread()))
tonyp@2315 423
tonyp@2315 424 #define assert_heap_locked() \
tonyp@2315 425 do { \
tonyp@2315 426 assert(Heap_lock->owned_by_self(), \
tonyp@2315 427 heap_locking_asserts_err_msg("should be holding the Heap_lock")); \
tonyp@2315 428 } while (0)
tonyp@2315 429
tonyp@2643 430 #define assert_heap_locked_or_at_safepoint(_should_be_vm_thread_) \
tonyp@2315 431 do { \
tonyp@2315 432 assert(Heap_lock->owned_by_self() || \
tonyp@2472 433 (SafepointSynchronize::is_at_safepoint() && \
tonyp@2643 434 ((_should_be_vm_thread_) == Thread::current()->is_VM_thread())), \
tonyp@2315 435 heap_locking_asserts_err_msg("should be holding the Heap_lock or " \
tonyp@2315 436 "should be at a safepoint")); \
tonyp@2315 437 } while (0)
tonyp@2315 438
tonyp@2315 439 #define assert_heap_locked_and_not_at_safepoint() \
tonyp@2315 440 do { \
tonyp@2315 441 assert(Heap_lock->owned_by_self() && \
tonyp@2315 442 !SafepointSynchronize::is_at_safepoint(), \
tonyp@2315 443 heap_locking_asserts_err_msg("should be holding the Heap_lock and " \
tonyp@2315 444 "should not be at a safepoint")); \
tonyp@2315 445 } while (0)
tonyp@2315 446
tonyp@2315 447 #define assert_heap_not_locked() \
tonyp@2315 448 do { \
tonyp@2315 449 assert(!Heap_lock->owned_by_self(), \
tonyp@2315 450 heap_locking_asserts_err_msg("should not be holding the Heap_lock")); \
tonyp@2315 451 } while (0)
tonyp@2315 452
tonyp@2315 453 #define assert_heap_not_locked_and_not_at_safepoint() \
tonyp@2315 454 do { \
tonyp@2315 455 assert(!Heap_lock->owned_by_self() && \
tonyp@2315 456 !SafepointSynchronize::is_at_safepoint(), \
tonyp@2315 457 heap_locking_asserts_err_msg("should not be holding the Heap_lock and " \
tonyp@2315 458 "should not be at a safepoint")); \
tonyp@2315 459 } while (0)
tonyp@2315 460
tonyp@2643 461 #define assert_at_safepoint(_should_be_vm_thread_) \
tonyp@2315 462 do { \
tonyp@2472 463 assert(SafepointSynchronize::is_at_safepoint() && \
tonyp@2643 464 ((_should_be_vm_thread_) == Thread::current()->is_VM_thread()), \
tonyp@2315 465 heap_locking_asserts_err_msg("should be at a safepoint")); \
tonyp@2315 466 } while (0)
tonyp@2315 467
tonyp@2315 468 #define assert_not_at_safepoint() \
tonyp@2315 469 do { \
tonyp@2315 470 assert(!SafepointSynchronize::is_at_safepoint(), \
tonyp@2315 471 heap_locking_asserts_err_msg("should not be at a safepoint")); \
tonyp@2315 472 } while (0)
tonyp@2315 473
ysr@777 474 protected:
ysr@777 475
johnc@3021 476 // The young region list.
ysr@777 477 YoungList* _young_list;
ysr@777 478
ysr@777 479 // The current policy object for the collector.
ysr@777 480 G1CollectorPolicy* _g1_policy;
ysr@777 481
tonyp@2472 482 // This is the second level of trying to allocate a new region. If
tonyp@2715 483 // new_region() didn't find a region on the free_list, this call will
tonyp@2715 484 // check whether there's anything available on the
tonyp@2715 485 // secondary_free_list and/or wait for more regions to appear on
tonyp@2715 486 // that list, if _free_regions_coming is set.
tonyp@2643 487 HeapRegion* new_region_try_secondary_free_list();
ysr@777 488
tonyp@2643 489 // Try to allocate a single non-humongous HeapRegion sufficient for
tonyp@2643 490 // an allocation of the given word_size. If do_expand is true,
tonyp@2643 491 // attempt to expand the heap if necessary to satisfy the allocation
tonyp@2643 492 // request.
tonyp@2715 493 HeapRegion* new_region(size_t word_size, bool do_expand);
ysr@777 494
tonyp@2643 495 // Attempt to satisfy a humongous allocation request of the given
tonyp@2643 496 // size by finding a contiguous set of free regions of num_regions
tonyp@2643 497 // length and remove them from the master free list. Return the
tonyp@2963 498 // index of the first region or G1_NULL_HRS_INDEX if the search
tonyp@2963 499 // was unsuccessful.
tonyp@3713 500 uint humongous_obj_allocate_find_first(uint num_regions,
tonyp@3713 501 size_t word_size);
ysr@777 502
tonyp@2643 503 // Initialize a contiguous set of free regions of length num_regions
tonyp@2643 504 // and starting at index first so that they appear as a single
tonyp@2643 505 // humongous region.
tonyp@3713 506 HeapWord* humongous_obj_allocate_initialize_regions(uint first,
tonyp@3713 507 uint num_regions,
tonyp@2643 508 size_t word_size);
tonyp@2643 509
tonyp@2643 510 // Attempt to allocate a humongous object of the given size. Return
tonyp@2643 511 // NULL if unsuccessful.
tonyp@2472 512 HeapWord* humongous_obj_allocate(size_t word_size);
ysr@777 513
tonyp@2315 514 // The following two methods, allocate_new_tlab() and
tonyp@2315 515 // mem_allocate(), are the two main entry points from the runtime
tonyp@2315 516 // into the G1's allocation routines. They have the following
tonyp@2315 517 // assumptions:
tonyp@2315 518 //
tonyp@2315 519 // * They should both be called outside safepoints.
tonyp@2315 520 //
tonyp@2315 521 // * They should both be called without holding the Heap_lock.
tonyp@2315 522 //
tonyp@2315 523 // * All allocation requests for new TLABs should go to
tonyp@2315 524 // allocate_new_tlab().
tonyp@2315 525 //
tonyp@2971 526 // * All non-TLAB allocation requests should go to mem_allocate().
tonyp@2315 527 //
tonyp@2315 528 // * If either call cannot satisfy the allocation request using the
tonyp@2315 529 // current allocating region, they will try to get a new one. If
tonyp@2315 530 // this fails, they will attempt to do an evacuation pause and
tonyp@2315 531 // retry the allocation.
tonyp@2315 532 //
tonyp@2315 533 // * If all allocation attempts fail, even after trying to schedule
tonyp@2315 534 // an evacuation pause, allocate_new_tlab() will return NULL,
tonyp@2315 535 // whereas mem_allocate() will attempt a heap expansion and/or
tonyp@2315 536 // schedule a Full GC.
tonyp@2315 537 //
tonyp@2315 538 // * We do not allow humongous-sized TLABs. So, allocate_new_tlab
tonyp@2315 539 // should never be called with word_size being humongous. All
tonyp@2315 540 // humongous allocation requests should go to mem_allocate() which
tonyp@2315 541 // will satisfy them with a special path.
ysr@777 542
tonyp@2315 543 virtual HeapWord* allocate_new_tlab(size_t word_size);
tonyp@2315 544
tonyp@2315 545 virtual HeapWord* mem_allocate(size_t word_size,
tonyp@2315 546 bool* gc_overhead_limit_was_exceeded);
tonyp@2315 547
tonyp@2715 548 // The following three methods take a gc_count_before_ret
tonyp@2715 549 // parameter which is used to return the GC count if the method
tonyp@2715 550 // returns NULL. Given that we are required to read the GC count
tonyp@2715 551 // while holding the Heap_lock, and these paths will take the
tonyp@2715 552 // Heap_lock at some point, it's easier to get them to read the GC
tonyp@2715 553 // count while holding the Heap_lock before they return NULL instead
tonyp@2715 554 // of the caller (namely: mem_allocate()) having to also take the
tonyp@2715 555 // Heap_lock just to read the GC count.
tonyp@2315 556
tonyp@2715 557 // First-level mutator allocation attempt: try to allocate out of
tonyp@2715 558 // the mutator alloc region without taking the Heap_lock. This
tonyp@2715 559 // should only be used for non-humongous allocations.
tonyp@2715 560 inline HeapWord* attempt_allocation(size_t word_size,
tonyp@2715 561 unsigned int* gc_count_before_ret);
tonyp@2315 562
tonyp@2715 563 // Second-level mutator allocation attempt: take the Heap_lock and
tonyp@2715 564 // retry the allocation attempt, potentially scheduling a GC
tonyp@2715 565 // pause. This should only be used for non-humongous allocations.
tonyp@2715 566 HeapWord* attempt_allocation_slow(size_t word_size,
tonyp@2715 567 unsigned int* gc_count_before_ret);
tonyp@2315 568
tonyp@2715 569 // Takes the Heap_lock and attempts a humongous allocation. It can
tonyp@2715 570 // potentially schedule a GC pause.
tonyp@2715 571 HeapWord* attempt_allocation_humongous(size_t word_size,
tonyp@2715 572 unsigned int* gc_count_before_ret);
tonyp@2454 573
tonyp@2715 574 // Allocation attempt that should be called during safepoints (e.g.,
tonyp@2715 575 // at the end of a successful GC). expect_null_mutator_alloc_region
tonyp@2715 576 // specifies whether the mutator alloc region is expected to be NULL
tonyp@2715 577 // or not.
tonyp@2315 578 HeapWord* attempt_allocation_at_safepoint(size_t word_size,
tonyp@2715 579 bool expect_null_mutator_alloc_region);
tonyp@2315 580
tonyp@2315 581 // It dirties the cards that cover the block so that so that the post
tonyp@2315 582 // write barrier never queues anything when updating objects on this
tonyp@2315 583 // block. It is assumed (and in fact we assert) that the block
tonyp@2315 584 // belongs to a young region.
tonyp@2315 585 inline void dirty_young_block(HeapWord* start, size_t word_size);
ysr@777 586
ysr@777 587 // Allocate blocks during garbage collection. Will ensure an
ysr@777 588 // allocation region, either by picking one or expanding the
ysr@777 589 // heap, and then allocate a block of the given size. The block
ysr@777 590 // may not be a humongous - it must fit into a single heap region.
ysr@777 591 HeapWord* par_allocate_during_gc(GCAllocPurpose purpose, size_t word_size);
ysr@777 592
ysr@777 593 HeapWord* allocate_during_gc_slow(GCAllocPurpose purpose,
ysr@777 594 HeapRegion* alloc_region,
ysr@777 595 bool par,
ysr@777 596 size_t word_size);
ysr@777 597
ysr@777 598 // Ensure that no further allocations can happen in "r", bearing in mind
ysr@777 599 // that parallel threads might be attempting allocations.
ysr@777 600 void par_allocate_remaining_space(HeapRegion* r);
ysr@777 601
tonyp@3028 602 // Allocation attempt during GC for a survivor object / PLAB.
tonyp@3028 603 inline HeapWord* survivor_attempt_allocation(size_t word_size);
apetrusenko@980 604
tonyp@3028 605 // Allocation attempt during GC for an old object / PLAB.
tonyp@3028 606 inline HeapWord* old_attempt_allocation(size_t word_size);
tonyp@2715 607
tonyp@3028 608 // These methods are the "callbacks" from the G1AllocRegion class.
tonyp@3028 609
tonyp@3028 610 // For mutator alloc regions.
tonyp@2715 611 HeapRegion* new_mutator_alloc_region(size_t word_size, bool force);
tonyp@2715 612 void retire_mutator_alloc_region(HeapRegion* alloc_region,
tonyp@2715 613 size_t allocated_bytes);
tonyp@2715 614
tonyp@3028 615 // For GC alloc regions.
tonyp@3713 616 HeapRegion* new_gc_alloc_region(size_t word_size, uint count,
tonyp@3028 617 GCAllocPurpose ap);
tonyp@3028 618 void retire_gc_alloc_region(HeapRegion* alloc_region,
tonyp@3028 619 size_t allocated_bytes, GCAllocPurpose ap);
tonyp@3028 620
tonyp@2011 621 // - if explicit_gc is true, the GC is for a System.gc() or a heap
tonyp@2315 622 // inspection request and should collect the entire heap
tonyp@2315 623 // - if clear_all_soft_refs is true, all soft references should be
tonyp@2315 624 // cleared during the GC
tonyp@2011 625 // - if explicit_gc is false, word_size describes the allocation that
tonyp@2315 626 // the GC should attempt (at least) to satisfy
tonyp@2315 627 // - it returns false if it is unable to do the collection due to the
tonyp@2315 628 // GC locker being active, true otherwise
tonyp@2315 629 bool do_collection(bool explicit_gc,
tonyp@2011 630 bool clear_all_soft_refs,
ysr@777 631 size_t word_size);
ysr@777 632
ysr@777 633 // Callback from VM_G1CollectFull operation.
ysr@777 634 // Perform a full collection.
coleenp@4037 635 virtual void do_full_collection(bool clear_all_soft_refs);
ysr@777 636
ysr@777 637 // Resize the heap if necessary after a full collection. If this is
ysr@777 638 // after a collect-for allocation, "word_size" is the allocation size,
ysr@777 639 // and will be considered part of the used portion of the heap.
ysr@777 640 void resize_if_necessary_after_full_collection(size_t word_size);
ysr@777 641
ysr@777 642 // Callback from VM_G1CollectForAllocation operation.
ysr@777 643 // This function does everything necessary/possible to satisfy a
ysr@777 644 // failed allocation request (including collection, expansion, etc.)
tonyp@2315 645 HeapWord* satisfy_failed_allocation(size_t word_size, bool* succeeded);
ysr@777 646
ysr@777 647 // Attempting to expand the heap sufficiently
ysr@777 648 // to support an allocation of the given "word_size". If
ysr@777 649 // successful, perform the allocation and return the address of the
ysr@777 650 // allocated block, or else "NULL".
tonyp@2315 651 HeapWord* expand_and_allocate(size_t word_size);
ysr@777 652
johnc@3175 653 // Process any reference objects discovered during
johnc@3175 654 // an incremental evacuation pause.
johnc@3175 655 void process_discovered_references();
johnc@3175 656
johnc@3175 657 // Enqueue any remaining discovered references
johnc@3175 658 // after processing.
johnc@3175 659 void enqueue_discovered_references();
johnc@3175 660
ysr@777 661 public:
jmasa@2821 662
tonyp@3176 663 G1MonitoringSupport* g1mm() {
tonyp@3176 664 assert(_g1mm != NULL, "should have been initialized");
tonyp@3176 665 return _g1mm;
tonyp@3176 666 }
jmasa@2821 667
ysr@777 668 // Expand the garbage-first heap by at least the given size (in bytes!).
johnc@2504 669 // Returns true if the heap was expanded by the requested amount;
johnc@2504 670 // false otherwise.
ysr@777 671 // (Rounds up to a HeapRegion boundary.)
johnc@2504 672 bool expand(size_t expand_bytes);
ysr@777 673
ysr@777 674 // Do anything common to GC's.
ysr@777 675 virtual void gc_prologue(bool full);
ysr@777 676 virtual void gc_epilogue(bool full);
ysr@777 677
tonyp@961 678 // We register a region with the fast "in collection set" test. We
tonyp@961 679 // simply set to true the array slot corresponding to this region.
tonyp@961 680 void register_region_with_in_cset_fast_test(HeapRegion* r) {
tonyp@961 681 assert(_in_cset_fast_test_base != NULL, "sanity");
tonyp@961 682 assert(r->in_collection_set(), "invariant");
tonyp@3713 683 uint index = r->hrs_index();
tonyp@2963 684 assert(index < _in_cset_fast_test_length, "invariant");
tonyp@961 685 assert(!_in_cset_fast_test_base[index], "invariant");
tonyp@961 686 _in_cset_fast_test_base[index] = true;
tonyp@961 687 }
tonyp@961 688
tonyp@961 689 // This is a fast test on whether a reference points into the
tonyp@961 690 // collection set or not. It does not assume that the reference
tonyp@961 691 // points into the heap; if it doesn't, it will return false.
tonyp@961 692 bool in_cset_fast_test(oop obj) {
tonyp@961 693 assert(_in_cset_fast_test != NULL, "sanity");
tonyp@961 694 if (_g1_committed.contains((HeapWord*) obj)) {
tonyp@961 695 // no need to subtract the bottom of the heap from obj,
tonyp@961 696 // _in_cset_fast_test is biased
tonyp@3713 697 uintx index = (uintx) obj >> HeapRegion::LogOfHRGrainBytes;
tonyp@961 698 bool ret = _in_cset_fast_test[index];
tonyp@961 699 // let's make sure the result is consistent with what the slower
tonyp@961 700 // test returns
tonyp@961 701 assert( ret || !obj_in_cs(obj), "sanity");
tonyp@961 702 assert(!ret || obj_in_cs(obj), "sanity");
tonyp@961 703 return ret;
tonyp@961 704 } else {
tonyp@961 705 return false;
tonyp@961 706 }
tonyp@961 707 }
tonyp@961 708
johnc@1829 709 void clear_cset_fast_test() {
johnc@1829 710 assert(_in_cset_fast_test_base != NULL, "sanity");
johnc@1829 711 memset(_in_cset_fast_test_base, false,
tonyp@3713 712 (size_t) _in_cset_fast_test_length * sizeof(bool));
johnc@1829 713 }
johnc@1829 714
brutisso@3823 715 // This is called at the start of either a concurrent cycle or a Full
brutisso@3823 716 // GC to update the number of old marking cycles started.
brutisso@3823 717 void increment_old_marking_cycles_started();
brutisso@3823 718
tonyp@2011 719 // This is called at the end of either a concurrent cycle or a Full
brutisso@3823 720 // GC to update the number of old marking cycles completed. Those two
tonyp@2011 721 // can happen in a nested fashion, i.e., we start a concurrent
tonyp@2011 722 // cycle, a Full GC happens half-way through it which ends first,
tonyp@2011 723 // and then the cycle notices that a Full GC happened and ends
tonyp@2372 724 // too. The concurrent parameter is a boolean to help us do a bit
tonyp@2372 725 // tighter consistency checking in the method. If concurrent is
tonyp@2372 726 // false, the caller is the inner caller in the nesting (i.e., the
tonyp@2372 727 // Full GC). If concurrent is true, the caller is the outer caller
tonyp@2372 728 // in this nesting (i.e., the concurrent cycle). Further nesting is
brutisso@3823 729 // not currently supported. The end of this call also notifies
tonyp@2372 730 // the FullGCCount_lock in case a Java thread is waiting for a full
tonyp@2372 731 // GC to happen (e.g., it called System.gc() with
tonyp@2011 732 // +ExplicitGCInvokesConcurrent).
brutisso@3823 733 void increment_old_marking_cycles_completed(bool concurrent);
tonyp@2011 734
brutisso@3823 735 unsigned int old_marking_cycles_completed() {
brutisso@3823 736 return _old_marking_cycles_completed;
tonyp@2011 737 }
tonyp@2011 738
tonyp@2975 739 G1HRPrinter* hr_printer() { return &_hr_printer; }
tonyp@2975 740
ysr@777 741 protected:
ysr@777 742
ysr@777 743 // Shrink the garbage-first heap by at most the given size (in bytes!).
ysr@777 744 // (Rounds down to a HeapRegion boundary.)
ysr@777 745 virtual void shrink(size_t expand_bytes);
ysr@777 746 void shrink_helper(size_t expand_bytes);
ysr@777 747
jcoomes@2064 748 #if TASKQUEUE_STATS
jcoomes@2064 749 static void print_taskqueue_stats_hdr(outputStream* const st = gclog_or_tty);
jcoomes@2064 750 void print_taskqueue_stats(outputStream* const st = gclog_or_tty) const;
jcoomes@2064 751 void reset_taskqueue_stats();
jcoomes@2064 752 #endif // TASKQUEUE_STATS
jcoomes@2064 753
tonyp@2315 754 // Schedule the VM operation that will do an evacuation pause to
tonyp@2315 755 // satisfy an allocation request of word_size. *succeeded will
tonyp@2315 756 // return whether the VM operation was successful (it did do an
tonyp@2315 757 // evacuation pause) or not (another thread beat us to it or the GC
tonyp@2315 758 // locker was active). Given that we should not be holding the
tonyp@2315 759 // Heap_lock when we enter this method, we will pass the
tonyp@2315 760 // gc_count_before (i.e., total_collections()) as a parameter since
tonyp@2315 761 // it has to be read while holding the Heap_lock. Currently, both
tonyp@2315 762 // methods that call do_collection_pause() release the Heap_lock
tonyp@2315 763 // before the call, so it's easy to read gc_count_before just before.
tonyp@2315 764 HeapWord* do_collection_pause(size_t word_size,
tonyp@2315 765 unsigned int gc_count_before,
tonyp@2315 766 bool* succeeded);
ysr@777 767
ysr@777 768 // The guts of the incremental collection pause, executed by the vm
tonyp@2315 769 // thread. It returns false if it is unable to do the collection due
tonyp@2315 770 // to the GC locker being active, true otherwise
tonyp@2315 771 bool do_collection_pause_at_safepoint(double target_pause_time_ms);
ysr@777 772
ysr@777 773 // Actually do the work of evacuating the collection set.
tonyp@2315 774 void evacuate_collection_set();
ysr@777 775
ysr@777 776 // The g1 remembered set of the heap.
ysr@777 777 G1RemSet* _g1_rem_set;
ysr@777 778 // And it's mod ref barrier set, used to track updates for the above.
ysr@777 779 ModRefBarrierSet* _mr_bs;
ysr@777 780
iveresov@1051 781 // A set of cards that cover the objects for which the Rsets should be updated
iveresov@1051 782 // concurrently after the collection.
iveresov@1051 783 DirtyCardQueueSet _dirty_card_queue_set;
iveresov@1051 784
ysr@777 785 // The Heap Region Rem Set Iterator.
ysr@777 786 HeapRegionRemSetIterator** _rem_set_iterator;
ysr@777 787
ysr@777 788 // The closure used to refine a single card.
ysr@777 789 RefineCardTableEntryClosure* _refine_cte_cl;
ysr@777 790
ysr@777 791 // A function to check the consistency of dirty card logs.
ysr@777 792 void check_ct_logs_at_safepoint();
ysr@777 793
johnc@2060 794 // A DirtyCardQueueSet that is used to hold cards that contain
johnc@2060 795 // references into the current collection set. This is used to
johnc@2060 796 // update the remembered sets of the regions in the collection
johnc@2060 797 // set in the event of an evacuation failure.
johnc@2060 798 DirtyCardQueueSet _into_cset_dirty_card_queue_set;
johnc@2060 799
ysr@777 800 // After a collection pause, make the regions in the CS into free
ysr@777 801 // regions.
ysr@777 802 void free_collection_set(HeapRegion* cs_head);
ysr@777 803
johnc@1829 804 // Abandon the current collection set without recording policy
johnc@1829 805 // statistics or updating free lists.
johnc@1829 806 void abandon_collection_set(HeapRegion* cs_head);
johnc@1829 807
ysr@777 808 // Applies "scan_non_heap_roots" to roots outside the heap,
ysr@777 809 // "scan_rs" to roots inside the heap (having done "set_region" to
coleenp@4037 810 // indicate the region in which the root resides),
coleenp@4037 811 // and does "scan_metadata" If "scan_rs" is
ysr@777 812 // NULL, then this step is skipped. The "worker_i"
ysr@777 813 // param is for use with parallel roots processing, and should be
ysr@777 814 // the "i" of the calling parallel worker thread's work(i) function.
ysr@777 815 // In the sequential case this param will be ignored.
coleenp@4037 816 void g1_process_strong_roots(bool is_scavenging,
tonyp@3537 817 ScanningOption so,
ysr@777 818 OopClosure* scan_non_heap_roots,
ysr@777 819 OopsInHeapRegionClosure* scan_rs,
coleenp@4037 820 G1KlassScanClosure* scan_klasses,
ysr@777 821 int worker_i);
ysr@777 822
ysr@777 823 // Apply "blk" to all the weak roots of the system. These include
ysr@777 824 // JNI weak roots, the code cache, system dictionary, symbol table,
ysr@777 825 // string table, and referents of reachable weak refs.
ysr@777 826 void g1_process_weak_roots(OopClosure* root_closure,
ysr@777 827 OopClosure* non_root_closure);
ysr@777 828
tonyp@2643 829 // Frees a non-humongous region by initializing its contents and
tonyp@2472 830 // adding it to the free list that's passed as a parameter (this is
tonyp@2472 831 // usually a local list which will be appended to the master free
tonyp@2472 832 // list later). The used bytes of freed regions are accumulated in
tonyp@2472 833 // pre_used. If par is true, the region's RSet will not be freed
tonyp@2472 834 // up. The assumption is that this will be done later.
tonyp@2472 835 void free_region(HeapRegion* hr,
tonyp@2472 836 size_t* pre_used,
tonyp@2472 837 FreeRegionList* free_list,
tonyp@2472 838 bool par);
ysr@777 839
tonyp@2643 840 // Frees a humongous region by collapsing it into individual regions
tonyp@2643 841 // and calling free_region() for each of them. The freed regions
tonyp@2643 842 // will be added to the free list that's passed as a parameter (this
tonyp@2643 843 // is usually a local list which will be appended to the master free
tonyp@2643 844 // list later). The used bytes of freed regions are accumulated in
tonyp@2643 845 // pre_used. If par is true, the region's RSet will not be freed
tonyp@2643 846 // up. The assumption is that this will be done later.
tonyp@2472 847 void free_humongous_region(HeapRegion* hr,
tonyp@2472 848 size_t* pre_used,
tonyp@2472 849 FreeRegionList* free_list,
tonyp@2472 850 HumongousRegionSet* humongous_proxy_set,
tonyp@2472 851 bool par);
ysr@777 852
tonyp@2963 853 // Notifies all the necessary spaces that the committed space has
tonyp@2963 854 // been updated (either expanded or shrunk). It should be called
tonyp@2963 855 // after _g1_storage is updated.
tonyp@2963 856 void update_committed_space(HeapWord* old_end, HeapWord* new_end);
tonyp@2963 857
ysr@777 858 // The concurrent marker (and the thread it runs in.)
ysr@777 859 ConcurrentMark* _cm;
ysr@777 860 ConcurrentMarkThread* _cmThread;
ysr@777 861 bool _mark_in_progress;
ysr@777 862
ysr@777 863 // The concurrent refiner.
ysr@777 864 ConcurrentG1Refine* _cg1r;
ysr@777 865
ysr@777 866 // The parallel task queues
ysr@777 867 RefToScanQueueSet *_task_queues;
ysr@777 868
ysr@777 869 // True iff a evacuation has failed in the current collection.
ysr@777 870 bool _evacuation_failed;
ysr@777 871
ysr@777 872 // Set the attribute indicating whether evacuation has failed in the
ysr@777 873 // current collection.
ysr@777 874 void set_evacuation_failed(bool b) { _evacuation_failed = b; }
ysr@777 875
ysr@777 876 // Failed evacuations cause some logical from-space objects to have
ysr@777 877 // forwarding pointers to themselves. Reset them.
ysr@777 878 void remove_self_forwarding_pointers();
ysr@777 879
ysr@777 880 // When one is non-null, so is the other. Together, they each pair is
ysr@777 881 // an object with a preserved mark, and its mark value.
ysr@777 882 GrowableArray<oop>* _objs_with_preserved_marks;
ysr@777 883 GrowableArray<markOop>* _preserved_marks_of_objs;
ysr@777 884
ysr@777 885 // Preserve the mark of "obj", if necessary, in preparation for its mark
ysr@777 886 // word being overwritten with a self-forwarding-pointer.
ysr@777 887 void preserve_mark_if_necessary(oop obj, markOop m);
ysr@777 888
ysr@777 889 // The stack of evac-failure objects left to be scanned.
ysr@777 890 GrowableArray<oop>* _evac_failure_scan_stack;
ysr@777 891 // The closure to apply to evac-failure objects.
ysr@777 892
ysr@777 893 OopsInHeapRegionClosure* _evac_failure_closure;
ysr@777 894 // Set the field above.
ysr@777 895 void
ysr@777 896 set_evac_failure_closure(OopsInHeapRegionClosure* evac_failure_closure) {
ysr@777 897 _evac_failure_closure = evac_failure_closure;
ysr@777 898 }
ysr@777 899
ysr@777 900 // Push "obj" on the scan stack.
ysr@777 901 void push_on_evac_failure_scan_stack(oop obj);
ysr@777 902 // Process scan stack entries until the stack is empty.
ysr@777 903 void drain_evac_failure_scan_stack();
ysr@777 904 // True iff an invocation of "drain_scan_stack" is in progress; to
ysr@777 905 // prevent unnecessary recursion.
ysr@777 906 bool _drain_in_progress;
ysr@777 907
ysr@777 908 // Do any necessary initialization for evacuation-failure handling.
ysr@777 909 // "cl" is the closure that will be used to process evac-failure
ysr@777 910 // objects.
ysr@777 911 void init_for_evac_failure(OopsInHeapRegionClosure* cl);
ysr@777 912 // Do any necessary cleanup for evacuation-failure handling data
ysr@777 913 // structures.
ysr@777 914 void finalize_for_evac_failure();
ysr@777 915
ysr@777 916 // An attempt to evacuate "obj" has failed; take necessary steps.
tonyp@3416 917 oop handle_evacuation_failure_par(OopsInHeapRegionClosure* cl, oop obj);
ysr@777 918 void handle_evacuation_failure_common(oop obj, markOop m);
ysr@777 919
johnc@4016 920 #ifndef PRODUCT
johnc@4016 921 // Support for forcing evacuation failures. Analogous to
johnc@4016 922 // PromotionFailureALot for the other collectors.
johnc@4016 923
johnc@4016 924 // Records whether G1EvacuationFailureALot should be in effect
johnc@4016 925 // for the current GC
johnc@4016 926 bool _evacuation_failure_alot_for_current_gc;
johnc@4016 927
johnc@4016 928 // Used to record the GC number for interval checking when
johnc@4016 929 // determining whether G1EvaucationFailureALot is in effect
johnc@4016 930 // for the current GC.
johnc@4016 931 size_t _evacuation_failure_alot_gc_number;
johnc@4016 932
johnc@4016 933 // Count of the number of evacuations between failures.
johnc@4016 934 volatile size_t _evacuation_failure_alot_count;
johnc@4016 935
johnc@4016 936 // Set whether G1EvacuationFailureALot should be in effect
johnc@4016 937 // for the current GC (based upon the type of GC and which
johnc@4016 938 // command line flags are set);
johnc@4016 939 inline bool evacuation_failure_alot_for_gc_type(bool gcs_are_young,
johnc@4016 940 bool during_initial_mark,
johnc@4016 941 bool during_marking);
johnc@4016 942
johnc@4016 943 inline void set_evacuation_failure_alot_for_current_gc();
johnc@4016 944
johnc@4016 945 // Return true if it's time to cause an evacuation failure.
johnc@4016 946 inline bool evacuation_should_fail();
johnc@4016 947
johnc@4016 948 // Reset the G1EvacuationFailureALot counters. Should be called at
johnc@4016 949 // the end of an evacuation pause in which an evacuation failure ocurred.
johnc@4016 950 inline void reset_evacuation_should_fail();
johnc@4016 951 #endif // !PRODUCT
johnc@4016 952
johnc@3175 953 // ("Weak") Reference processing support.
johnc@3175 954 //
johnc@3175 955 // G1 has 2 instances of the referece processor class. One
johnc@3175 956 // (_ref_processor_cm) handles reference object discovery
johnc@3175 957 // and subsequent processing during concurrent marking cycles.
johnc@3175 958 //
johnc@3175 959 // The other (_ref_processor_stw) handles reference object
johnc@3175 960 // discovery and processing during full GCs and incremental
johnc@3175 961 // evacuation pauses.
johnc@3175 962 //
johnc@3175 963 // During an incremental pause, reference discovery will be
johnc@3175 964 // temporarily disabled for _ref_processor_cm and will be
johnc@3175 965 // enabled for _ref_processor_stw. At the end of the evacuation
johnc@3175 966 // pause references discovered by _ref_processor_stw will be
johnc@3175 967 // processed and discovery will be disabled. The previous
johnc@3175 968 // setting for reference object discovery for _ref_processor_cm
johnc@3175 969 // will be re-instated.
johnc@3175 970 //
johnc@3175 971 // At the start of marking:
johnc@3175 972 // * Discovery by the CM ref processor is verified to be inactive
johnc@3175 973 // and it's discovered lists are empty.
johnc@3175 974 // * Discovery by the CM ref processor is then enabled.
johnc@3175 975 //
johnc@3175 976 // At the end of marking:
johnc@3175 977 // * Any references on the CM ref processor's discovered
johnc@3175 978 // lists are processed (possibly MT).
johnc@3175 979 //
johnc@3175 980 // At the start of full GC we:
johnc@3175 981 // * Disable discovery by the CM ref processor and
johnc@3175 982 // empty CM ref processor's discovered lists
johnc@3175 983 // (without processing any entries).
johnc@3175 984 // * Verify that the STW ref processor is inactive and it's
johnc@3175 985 // discovered lists are empty.
johnc@3175 986 // * Temporarily set STW ref processor discovery as single threaded.
johnc@3175 987 // * Temporarily clear the STW ref processor's _is_alive_non_header
johnc@3175 988 // field.
johnc@3175 989 // * Finally enable discovery by the STW ref processor.
johnc@3175 990 //
johnc@3175 991 // The STW ref processor is used to record any discovered
johnc@3175 992 // references during the full GC.
johnc@3175 993 //
johnc@3175 994 // At the end of a full GC we:
johnc@3175 995 // * Enqueue any reference objects discovered by the STW ref processor
johnc@3175 996 // that have non-live referents. This has the side-effect of
johnc@3175 997 // making the STW ref processor inactive by disabling discovery.
johnc@3175 998 // * Verify that the CM ref processor is still inactive
johnc@3175 999 // and no references have been placed on it's discovered
johnc@3175 1000 // lists (also checked as a precondition during initial marking).
johnc@3175 1001
johnc@3175 1002 // The (stw) reference processor...
johnc@3175 1003 ReferenceProcessor* _ref_processor_stw;
johnc@3175 1004
johnc@3175 1005 // During reference object discovery, the _is_alive_non_header
johnc@3175 1006 // closure (if non-null) is applied to the referent object to
johnc@3175 1007 // determine whether the referent is live. If so then the
johnc@3175 1008 // reference object does not need to be 'discovered' and can
johnc@3175 1009 // be treated as a regular oop. This has the benefit of reducing
johnc@3175 1010 // the number of 'discovered' reference objects that need to
johnc@3175 1011 // be processed.
johnc@3175 1012 //
johnc@3175 1013 // Instance of the is_alive closure for embedding into the
johnc@3175 1014 // STW reference processor as the _is_alive_non_header field.
johnc@3175 1015 // Supplying a value for the _is_alive_non_header field is
johnc@3175 1016 // optional but doing so prevents unnecessary additions to
johnc@3175 1017 // the discovered lists during reference discovery.
johnc@3175 1018 G1STWIsAliveClosure _is_alive_closure_stw;
johnc@3175 1019
johnc@3175 1020 // The (concurrent marking) reference processor...
johnc@3175 1021 ReferenceProcessor* _ref_processor_cm;
johnc@3175 1022
johnc@2379 1023 // Instance of the concurrent mark is_alive closure for embedding
johnc@3175 1024 // into the Concurrent Marking reference processor as the
johnc@3175 1025 // _is_alive_non_header field. Supplying a value for the
johnc@3175 1026 // _is_alive_non_header field is optional but doing so prevents
johnc@3175 1027 // unnecessary additions to the discovered lists during reference
johnc@3175 1028 // discovery.
johnc@3175 1029 G1CMIsAliveClosure _is_alive_closure_cm;
ysr@777 1030
johnc@3336 1031 // Cache used by G1CollectedHeap::start_cset_region_for_worker().
johnc@3336 1032 HeapRegion** _worker_cset_start_region;
johnc@3336 1033
johnc@3336 1034 // Time stamp to validate the regions recorded in the cache
johnc@3336 1035 // used by G1CollectedHeap::start_cset_region_for_worker().
johnc@3336 1036 // The heap region entry for a given worker is valid iff
johnc@3336 1037 // the associated time stamp value matches the current value
johnc@3336 1038 // of G1CollectedHeap::_gc_time_stamp.
johnc@3336 1039 unsigned int* _worker_cset_start_region_time_stamp;
johnc@3336 1040
ysr@777 1041 enum G1H_process_strong_roots_tasks {
tonyp@3416 1042 G1H_PS_filter_satb_buffers,
ysr@777 1043 G1H_PS_refProcessor_oops_do,
ysr@777 1044 // Leave this one last.
ysr@777 1045 G1H_PS_NumElements
ysr@777 1046 };
ysr@777 1047
ysr@777 1048 SubTasksDone* _process_strong_tasks;
ysr@777 1049
tonyp@2472 1050 volatile bool _free_regions_coming;
ysr@777 1051
ysr@777 1052 public:
jmasa@2188 1053
jmasa@2188 1054 SubTasksDone* process_strong_tasks() { return _process_strong_tasks; }
jmasa@2188 1055
ysr@777 1056 void set_refine_cte_cl_concurrency(bool concurrent);
ysr@777 1057
jcoomes@2064 1058 RefToScanQueue *task_queue(int i) const;
ysr@777 1059
iveresov@1051 1060 // A set of cards where updates happened during the GC
iveresov@1051 1061 DirtyCardQueueSet& dirty_card_queue_set() { return _dirty_card_queue_set; }
iveresov@1051 1062
johnc@2060 1063 // A DirtyCardQueueSet that is used to hold cards that contain
johnc@2060 1064 // references into the current collection set. This is used to
johnc@2060 1065 // update the remembered sets of the regions in the collection
johnc@2060 1066 // set in the event of an evacuation failure.
johnc@2060 1067 DirtyCardQueueSet& into_cset_dirty_card_queue_set()
johnc@2060 1068 { return _into_cset_dirty_card_queue_set; }
johnc@2060 1069
ysr@777 1070 // Create a G1CollectedHeap with the specified policy.
ysr@777 1071 // Must call the initialize method afterwards.
ysr@777 1072 // May not return if something goes wrong.
ysr@777 1073 G1CollectedHeap(G1CollectorPolicy* policy);
ysr@777 1074
ysr@777 1075 // Initialize the G1CollectedHeap to have the initial and
coleenp@4037 1076 // maximum sizes and remembered and barrier sets
ysr@777 1077 // specified by the policy object.
ysr@777 1078 jint initialize();
ysr@777 1079
johnc@3175 1080 // Initialize weak reference processing.
johnc@2379 1081 virtual void ref_processing_init();
ysr@777 1082
jmasa@3357 1083 void set_par_threads(uint t) {
ysr@777 1084 SharedHeap::set_par_threads(t);
jmasa@3294 1085 // Done in SharedHeap but oddly there are
jmasa@3294 1086 // two _process_strong_tasks's in a G1CollectedHeap
jmasa@3294 1087 // so do it here too.
jmasa@3294 1088 _process_strong_tasks->set_n_threads(t);
jmasa@3294 1089 }
jmasa@3294 1090
jmasa@3294 1091 // Set _n_par_threads according to a policy TBD.
jmasa@3294 1092 void set_par_threads();
jmasa@3294 1093
jmasa@3294 1094 void set_n_termination(int t) {
jmasa@2188 1095 _process_strong_tasks->set_n_threads(t);
ysr@777 1096 }
ysr@777 1097
ysr@777 1098 virtual CollectedHeap::Name kind() const {
ysr@777 1099 return CollectedHeap::G1CollectedHeap;
ysr@777 1100 }
ysr@777 1101
ysr@777 1102 // The current policy object for the collector.
ysr@777 1103 G1CollectorPolicy* g1_policy() const { return _g1_policy; }
ysr@777 1104
coleenp@4037 1105 virtual CollectorPolicy* collector_policy() const { return (CollectorPolicy*) g1_policy(); }
coleenp@4037 1106
ysr@777 1107 // Adaptive size policy. No such thing for g1.
ysr@777 1108 virtual AdaptiveSizePolicy* size_policy() { return NULL; }
ysr@777 1109
ysr@777 1110 // The rem set and barrier set.
ysr@777 1111 G1RemSet* g1_rem_set() const { return _g1_rem_set; }
ysr@777 1112 ModRefBarrierSet* mr_bs() const { return _mr_bs; }
ysr@777 1113
ysr@777 1114 // The rem set iterator.
ysr@777 1115 HeapRegionRemSetIterator* rem_set_iterator(int i) {
ysr@777 1116 return _rem_set_iterator[i];
ysr@777 1117 }
ysr@777 1118
ysr@777 1119 HeapRegionRemSetIterator* rem_set_iterator() {
ysr@777 1120 return _rem_set_iterator[0];
ysr@777 1121 }
ysr@777 1122
ysr@777 1123 unsigned get_gc_time_stamp() {
ysr@777 1124 return _gc_time_stamp;
ysr@777 1125 }
ysr@777 1126
ysr@777 1127 void reset_gc_time_stamp() {
ysr@777 1128 _gc_time_stamp = 0;
iveresov@788 1129 OrderAccess::fence();
johnc@3336 1130 // Clear the cached CSet starting regions and time stamps.
johnc@3336 1131 // Their validity is dependent on the GC timestamp.
johnc@3336 1132 clear_cset_start_regions();
iveresov@788 1133 }
iveresov@788 1134
tonyp@3957 1135 void check_gc_time_stamps() PRODUCT_RETURN;
tonyp@3957 1136
iveresov@788 1137 void increment_gc_time_stamp() {
iveresov@788 1138 ++_gc_time_stamp;
iveresov@788 1139 OrderAccess::fence();
ysr@777 1140 }
ysr@777 1141
tonyp@3957 1142 // Reset the given region's GC timestamp. If it's starts humongous,
tonyp@3957 1143 // also reset the GC timestamp of its corresponding
tonyp@3957 1144 // continues humongous regions too.
tonyp@3957 1145 void reset_gc_time_stamps(HeapRegion* hr);
tonyp@3957 1146
johnc@2060 1147 void iterate_dirty_card_closure(CardTableEntryClosure* cl,
johnc@2060 1148 DirtyCardQueue* into_cset_dcq,
johnc@2060 1149 bool concurrent, int worker_i);
ysr@777 1150
ysr@777 1151 // The shared block offset table array.
ysr@777 1152 G1BlockOffsetSharedArray* bot_shared() const { return _bot_shared; }
ysr@777 1153
johnc@3175 1154 // Reference Processing accessors
johnc@3175 1155
johnc@3175 1156 // The STW reference processor....
johnc@3175 1157 ReferenceProcessor* ref_processor_stw() const { return _ref_processor_stw; }
johnc@3175 1158
johnc@3175 1159 // The Concurent Marking reference processor...
johnc@3175 1160 ReferenceProcessor* ref_processor_cm() const { return _ref_processor_cm; }
ysr@777 1161
ysr@777 1162 virtual size_t capacity() const;
ysr@777 1163 virtual size_t used() const;
tonyp@1281 1164 // This should be called when we're not holding the heap lock. The
tonyp@1281 1165 // result might be a bit inaccurate.
tonyp@1281 1166 size_t used_unlocked() const;
ysr@777 1167 size_t recalculate_used() const;
ysr@777 1168
ysr@777 1169 // These virtual functions do the actual allocation.
ysr@777 1170 // Some heaps may offer a contiguous region for shared non-blocking
ysr@777 1171 // allocation, via inlined code (by exporting the address of the top and
ysr@777 1172 // end fields defining the extent of the contiguous allocation region.)
ysr@777 1173 // But G1CollectedHeap doesn't yet support this.
ysr@777 1174
ysr@777 1175 // Return an estimate of the maximum allocation that could be performed
ysr@777 1176 // without triggering any collection or expansion activity. In a
ysr@777 1177 // generational collector, for example, this is probably the largest
ysr@777 1178 // allocation that could be supported (without expansion) in the youngest
ysr@777 1179 // generation. It is "unsafe" because no locks are taken; the result
ysr@777 1180 // should be treated as an approximation, not a guarantee, for use in
ysr@777 1181 // heuristic resizing decisions.
ysr@777 1182 virtual size_t unsafe_max_alloc();
ysr@777 1183
ysr@777 1184 virtual bool is_maximal_no_gc() const {
ysr@777 1185 return _g1_storage.uncommitted_size() == 0;
ysr@777 1186 }
ysr@777 1187
ysr@777 1188 // The total number of regions in the heap.
tonyp@3713 1189 uint n_regions() { return _hrs.length(); }
tonyp@2963 1190
tonyp@2963 1191 // The max number of regions in the heap.
tonyp@3713 1192 uint max_regions() { return _hrs.max_length(); }
ysr@777 1193
ysr@777 1194 // The number of regions that are completely free.
tonyp@3713 1195 uint free_regions() { return _free_list.length(); }
ysr@777 1196
ysr@777 1197 // The number of regions that are not completely free.
tonyp@3713 1198 uint used_regions() { return n_regions() - free_regions(); }
ysr@777 1199
ysr@777 1200 // The number of regions available for "regular" expansion.
tonyp@3713 1201 uint expansion_regions() { return _expansion_regions; }
ysr@777 1202
tonyp@2963 1203 // Factory method for HeapRegion instances. It will return NULL if
tonyp@2963 1204 // the allocation fails.
tonyp@3713 1205 HeapRegion* new_heap_region(uint hrs_index, HeapWord* bottom);
tonyp@2963 1206
tonyp@2849 1207 void verify_not_dirty_region(HeapRegion* hr) PRODUCT_RETURN;
tonyp@2849 1208 void verify_dirty_region(HeapRegion* hr) PRODUCT_RETURN;
tonyp@2715 1209 void verify_dirty_young_list(HeapRegion* head) PRODUCT_RETURN;
tonyp@2715 1210 void verify_dirty_young_regions() PRODUCT_RETURN;
tonyp@2715 1211
tonyp@2472 1212 // verify_region_sets() performs verification over the region
tonyp@2472 1213 // lists. It will be compiled in the product code to be used when
tonyp@2472 1214 // necessary (i.e., during heap verification).
tonyp@2472 1215 void verify_region_sets();
ysr@777 1216
tonyp@2472 1217 // verify_region_sets_optional() is planted in the code for
tonyp@2472 1218 // list verification in non-product builds (and it can be enabled in
tonyp@2472 1219 // product builds by definning HEAP_REGION_SET_FORCE_VERIFY to be 1).
tonyp@2472 1220 #if HEAP_REGION_SET_FORCE_VERIFY
tonyp@2472 1221 void verify_region_sets_optional() {
tonyp@2472 1222 verify_region_sets();
tonyp@2472 1223 }
tonyp@2472 1224 #else // HEAP_REGION_SET_FORCE_VERIFY
tonyp@2472 1225 void verify_region_sets_optional() { }
tonyp@2472 1226 #endif // HEAP_REGION_SET_FORCE_VERIFY
ysr@777 1227
tonyp@2472 1228 #ifdef ASSERT
tonyp@2643 1229 bool is_on_master_free_list(HeapRegion* hr) {
tonyp@2472 1230 return hr->containing_set() == &_free_list;
tonyp@2472 1231 }
ysr@777 1232
tonyp@2643 1233 bool is_in_humongous_set(HeapRegion* hr) {
tonyp@2472 1234 return hr->containing_set() == &_humongous_set;
tonyp@2643 1235 }
tonyp@2472 1236 #endif // ASSERT
ysr@777 1237
tonyp@2472 1238 // Wrapper for the region list operations that can be called from
tonyp@2472 1239 // methods outside this class.
ysr@777 1240
tonyp@2472 1241 void secondary_free_list_add_as_tail(FreeRegionList* list) {
tonyp@2472 1242 _secondary_free_list.add_as_tail(list);
tonyp@2472 1243 }
ysr@777 1244
tonyp@2472 1245 void append_secondary_free_list() {
tonyp@2714 1246 _free_list.add_as_head(&_secondary_free_list);
tonyp@2472 1247 }
ysr@777 1248
tonyp@2643 1249 void append_secondary_free_list_if_not_empty_with_lock() {
tonyp@2643 1250 // If the secondary free list looks empty there's no reason to
tonyp@2643 1251 // take the lock and then try to append it.
tonyp@2472 1252 if (!_secondary_free_list.is_empty()) {
tonyp@2472 1253 MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag);
tonyp@2472 1254 append_secondary_free_list();
tonyp@2472 1255 }
tonyp@2472 1256 }
ysr@777 1257
tonyp@3268 1258 void old_set_remove(HeapRegion* hr) {
tonyp@3268 1259 _old_set.remove(hr);
tonyp@3268 1260 }
tonyp@3268 1261
brutisso@3456 1262 size_t non_young_capacity_bytes() {
brutisso@3456 1263 return _old_set.total_capacity_bytes() + _humongous_set.total_capacity_bytes();
brutisso@3456 1264 }
brutisso@3456 1265
tonyp@2472 1266 void set_free_regions_coming();
tonyp@2472 1267 void reset_free_regions_coming();
tonyp@2472 1268 bool free_regions_coming() { return _free_regions_coming; }
tonyp@2472 1269 void wait_while_free_regions_coming();
ysr@777 1270
tonyp@3539 1271 // Determine whether the given region is one that we are using as an
tonyp@3539 1272 // old GC alloc region.
tonyp@3539 1273 bool is_old_gc_alloc_region(HeapRegion* hr) {
tonyp@3539 1274 return hr == _retained_old_gc_alloc_region;
tonyp@3539 1275 }
tonyp@3539 1276
ysr@777 1277 // Perform a collection of the heap; intended for use in implementing
ysr@777 1278 // "System.gc". This probably implies as full a collection as the
ysr@777 1279 // "CollectedHeap" supports.
ysr@777 1280 virtual void collect(GCCause::Cause cause);
ysr@777 1281
ysr@777 1282 // The same as above but assume that the caller holds the Heap_lock.
ysr@777 1283 void collect_locked(GCCause::Cause cause);
ysr@777 1284
ysr@777 1285 // True iff a evacuation has failed in the most-recent collection.
ysr@777 1286 bool evacuation_failed() { return _evacuation_failed; }
ysr@777 1287
tonyp@2472 1288 // It will free a region if it has allocated objects in it that are
tonyp@2472 1289 // all dead. It calls either free_region() or
tonyp@2472 1290 // free_humongous_region() depending on the type of the region that
tonyp@2472 1291 // is passed to it.
tonyp@2493 1292 void free_region_if_empty(HeapRegion* hr,
tonyp@2493 1293 size_t* pre_used,
tonyp@2493 1294 FreeRegionList* free_list,
tonyp@3268 1295 OldRegionSet* old_proxy_set,
tonyp@2493 1296 HumongousRegionSet* humongous_proxy_set,
tonyp@2493 1297 HRRSCleanupTask* hrrs_cleanup_task,
tonyp@2493 1298 bool par);
ysr@777 1299
tonyp@2472 1300 // It appends the free list to the master free list and updates the
tonyp@2472 1301 // master humongous list according to the contents of the proxy
tonyp@2472 1302 // list. It also adjusts the total used bytes according to pre_used
tonyp@2472 1303 // (if par is true, it will do so by taking the ParGCRareEvent_lock).
tonyp@2472 1304 void update_sets_after_freeing_regions(size_t pre_used,
tonyp@2472 1305 FreeRegionList* free_list,
tonyp@3268 1306 OldRegionSet* old_proxy_set,
tonyp@2472 1307 HumongousRegionSet* humongous_proxy_set,
tonyp@2472 1308 bool par);
ysr@777 1309
stefank@3335 1310 // Returns "TRUE" iff "p" points into the committed areas of the heap.
ysr@777 1311 virtual bool is_in(const void* p) const;
ysr@777 1312
ysr@777 1313 // Return "TRUE" iff the given object address is within the collection
ysr@777 1314 // set.
ysr@777 1315 inline bool obj_in_cs(oop obj);
ysr@777 1316
ysr@777 1317 // Return "TRUE" iff the given object address is in the reserved
coleenp@4037 1318 // region of g1.
ysr@777 1319 bool is_in_g1_reserved(const void* p) const {
ysr@777 1320 return _g1_reserved.contains(p);
ysr@777 1321 }
ysr@777 1322
tonyp@2717 1323 // Returns a MemRegion that corresponds to the space that has been
tonyp@2717 1324 // reserved for the heap
tonyp@2717 1325 MemRegion g1_reserved() {
tonyp@2717 1326 return _g1_reserved;
tonyp@2717 1327 }
tonyp@2717 1328
tonyp@2717 1329 // Returns a MemRegion that corresponds to the space that has been
ysr@777 1330 // committed in the heap
ysr@777 1331 MemRegion g1_committed() {
ysr@777 1332 return _g1_committed;
ysr@777 1333 }
ysr@777 1334
johnc@2593 1335 virtual bool is_in_closed_subset(const void* p) const;
ysr@777 1336
ysr@777 1337 // This resets the card table to all zeros. It is used after
ysr@777 1338 // a collection pause which used the card table to claim cards.
ysr@777 1339 void cleanUpCardTable();
ysr@777 1340
ysr@777 1341 // Iteration functions.
ysr@777 1342
ysr@777 1343 // Iterate over all the ref-containing fields of all objects, calling
ysr@777 1344 // "cl.do_oop" on each.
coleenp@4037 1345 virtual void oop_iterate(ExtendedOopClosure* cl);
ysr@777 1346
ysr@777 1347 // Same as above, restricted to a memory region.
coleenp@4037 1348 void oop_iterate(MemRegion mr, ExtendedOopClosure* cl);
ysr@777 1349
ysr@777 1350 // Iterate over all objects, calling "cl.do_object" on each.
coleenp@4037 1351 virtual void object_iterate(ObjectClosure* cl);
coleenp@4037 1352
coleenp@4037 1353 virtual void safe_object_iterate(ObjectClosure* cl) {
coleenp@4037 1354 object_iterate(cl);
iveresov@1113 1355 }
ysr@777 1356
ysr@777 1357 // Iterate over all objects allocated since the last collection, calling
ysr@777 1358 // "cl.do_object" on each. The heap must have been initialized properly
ysr@777 1359 // to support this function, or else this call will fail.
ysr@777 1360 virtual void object_iterate_since_last_GC(ObjectClosure* cl);
ysr@777 1361
ysr@777 1362 // Iterate over all spaces in use in the heap, in ascending address order.
ysr@777 1363 virtual void space_iterate(SpaceClosure* cl);
ysr@777 1364
ysr@777 1365 // Iterate over heap regions, in address order, terminating the
ysr@777 1366 // iteration early if the "doHeapRegion" method returns "true".
tonyp@2963 1367 void heap_region_iterate(HeapRegionClosure* blk) const;
ysr@777 1368
tonyp@2963 1369 // Return the region with the given index. It assumes the index is valid.
tonyp@3713 1370 HeapRegion* region_at(uint index) const { return _hrs.at(index); }
ysr@777 1371
ysr@777 1372 // Divide the heap region sequence into "chunks" of some size (the number
ysr@777 1373 // of regions divided by the number of parallel threads times some
ysr@777 1374 // overpartition factor, currently 4). Assumes that this will be called
ysr@777 1375 // in parallel by ParallelGCThreads worker threads with discinct worker
ysr@777 1376 // ids in the range [0..max(ParallelGCThreads-1, 1)], that all parallel
ysr@777 1377 // calls will use the same "claim_value", and that that claim value is
ysr@777 1378 // different from the claim_value of any heap region before the start of
ysr@777 1379 // the iteration. Applies "blk->doHeapRegion" to each of the regions, by
ysr@777 1380 // attempting to claim the first region in each chunk, and, if
ysr@777 1381 // successful, applying the closure to each region in the chunk (and
ysr@777 1382 // setting the claim value of the second and subsequent regions of the
ysr@777 1383 // chunk.) For now requires that "doHeapRegion" always returns "false",
ysr@777 1384 // i.e., that a closure never attempt to abort a traversal.
ysr@777 1385 void heap_region_par_iterate_chunked(HeapRegionClosure* blk,
jmasa@3357 1386 uint worker,
jmasa@3357 1387 uint no_of_par_workers,
ysr@777 1388 jint claim_value);
ysr@777 1389
tonyp@825 1390 // It resets all the region claim values to the default.
tonyp@825 1391 void reset_heap_region_claim_values();
tonyp@825 1392
johnc@3412 1393 // Resets the claim values of regions in the current
johnc@3412 1394 // collection set to the default.
johnc@3412 1395 void reset_cset_heap_region_claim_values();
johnc@3412 1396
tonyp@790 1397 #ifdef ASSERT
tonyp@790 1398 bool check_heap_region_claim_values(jint claim_value);
johnc@3296 1399
johnc@3296 1400 // Same as the routine above but only checks regions in the
johnc@3296 1401 // current collection set.
johnc@3296 1402 bool check_cset_heap_region_claim_values(jint claim_value);
tonyp@790 1403 #endif // ASSERT
tonyp@790 1404
johnc@3336 1405 // Clear the cached cset start regions and (more importantly)
johnc@3336 1406 // the time stamps. Called when we reset the GC time stamp.
johnc@3336 1407 void clear_cset_start_regions();
johnc@3336 1408
johnc@3336 1409 // Given the id of a worker, obtain or calculate a suitable
johnc@3336 1410 // starting region for iterating over the current collection set.
johnc@3296 1411 HeapRegion* start_cset_region_for_worker(int worker_i);
johnc@3296 1412
tonyp@3957 1413 // This is a convenience method that is used by the
tonyp@3957 1414 // HeapRegionIterator classes to calculate the starting region for
tonyp@3957 1415 // each worker so that they do not all start from the same region.
tonyp@3957 1416 HeapRegion* start_region_for_worker(uint worker_i, uint no_of_par_workers);
tonyp@3957 1417
ysr@777 1418 // Iterate over the regions (if any) in the current collection set.
ysr@777 1419 void collection_set_iterate(HeapRegionClosure* blk);
ysr@777 1420
ysr@777 1421 // As above but starting from region r
ysr@777 1422 void collection_set_iterate_from(HeapRegion* r, HeapRegionClosure *blk);
ysr@777 1423
ysr@777 1424 // Returns the first (lowest address) compactible space in the heap.
ysr@777 1425 virtual CompactibleSpace* first_compactible_space();
ysr@777 1426
ysr@777 1427 // A CollectedHeap will contain some number of spaces. This finds the
ysr@777 1428 // space containing a given address, or else returns NULL.
ysr@777 1429 virtual Space* space_containing(const void* addr) const;
ysr@777 1430
ysr@777 1431 // A G1CollectedHeap will contain some number of heap regions. This
ysr@777 1432 // finds the region containing a given address, or else returns NULL.
tonyp@2963 1433 template <class T>
tonyp@2963 1434 inline HeapRegion* heap_region_containing(const T addr) const;
ysr@777 1435
ysr@777 1436 // Like the above, but requires "addr" to be in the heap (to avoid a
ysr@777 1437 // null-check), and unlike the above, may return an continuing humongous
ysr@777 1438 // region.
tonyp@2963 1439 template <class T>
tonyp@2963 1440 inline HeapRegion* heap_region_containing_raw(const T addr) const;
ysr@777 1441
ysr@777 1442 // A CollectedHeap is divided into a dense sequence of "blocks"; that is,
ysr@777 1443 // each address in the (reserved) heap is a member of exactly
ysr@777 1444 // one block. The defining characteristic of a block is that it is
ysr@777 1445 // possible to find its size, and thus to progress forward to the next
ysr@777 1446 // block. (Blocks may be of different sizes.) Thus, blocks may
ysr@777 1447 // represent Java objects, or they might be free blocks in a
ysr@777 1448 // free-list-based heap (or subheap), as long as the two kinds are
ysr@777 1449 // distinguishable and the size of each is determinable.
ysr@777 1450
ysr@777 1451 // Returns the address of the start of the "block" that contains the
ysr@777 1452 // address "addr". We say "blocks" instead of "object" since some heaps
ysr@777 1453 // may not pack objects densely; a chunk may either be an object or a
ysr@777 1454 // non-object.
ysr@777 1455 virtual HeapWord* block_start(const void* addr) const;
ysr@777 1456
ysr@777 1457 // Requires "addr" to be the start of a chunk, and returns its size.
ysr@777 1458 // "addr + size" is required to be the start of a new chunk, or the end
ysr@777 1459 // of the active area of the heap.
ysr@777 1460 virtual size_t block_size(const HeapWord* addr) const;
ysr@777 1461
ysr@777 1462 // Requires "addr" to be the start of a block, and returns "TRUE" iff
ysr@777 1463 // the block is an object.
ysr@777 1464 virtual bool block_is_obj(const HeapWord* addr) const;
ysr@777 1465
ysr@777 1466 // Does this heap support heap inspection? (+PrintClassHistogram)
ysr@777 1467 virtual bool supports_heap_inspection() const { return true; }
ysr@777 1468
ysr@777 1469 // Section on thread-local allocation buffers (TLABs)
ysr@777 1470 // See CollectedHeap for semantics.
ysr@777 1471
ysr@777 1472 virtual bool supports_tlab_allocation() const;
ysr@777 1473 virtual size_t tlab_capacity(Thread* thr) const;
ysr@777 1474 virtual size_t unsafe_max_tlab_alloc(Thread* thr) const;
ysr@777 1475
ysr@777 1476 // Can a compiler initialize a new object without store barriers?
ysr@777 1477 // This permission only extends from the creation of a new object
ysr@1462 1478 // via a TLAB up to the first subsequent safepoint. If such permission
ysr@1462 1479 // is granted for this heap type, the compiler promises to call
ysr@1462 1480 // defer_store_barrier() below on any slow path allocation of
ysr@1462 1481 // a new object for which such initializing store barriers will
ysr@1462 1482 // have been elided. G1, like CMS, allows this, but should be
ysr@1462 1483 // ready to provide a compensating write barrier as necessary
ysr@1462 1484 // if that storage came out of a non-young region. The efficiency
ysr@1462 1485 // of this implementation depends crucially on being able to
ysr@1462 1486 // answer very efficiently in constant time whether a piece of
ysr@1462 1487 // storage in the heap comes from a young region or not.
ysr@1462 1488 // See ReduceInitialCardMarks.
ysr@777 1489 virtual bool can_elide_tlab_store_barriers() const {
brutisso@3184 1490 return true;
ysr@1462 1491 }
ysr@1462 1492
ysr@1601 1493 virtual bool card_mark_must_follow_store() const {
ysr@1601 1494 return true;
ysr@1601 1495 }
ysr@1601 1496
tonyp@2963 1497 bool is_in_young(const oop obj) {
ysr@1462 1498 HeapRegion* hr = heap_region_containing(obj);
ysr@1462 1499 return hr != NULL && hr->is_young();
ysr@1462 1500 }
ysr@1462 1501
jmasa@2909 1502 #ifdef ASSERT
jmasa@2909 1503 virtual bool is_in_partial_collection(const void* p);
jmasa@2909 1504 #endif
jmasa@2909 1505
jmasa@2909 1506 virtual bool is_scavengable(const void* addr);
jmasa@2909 1507
ysr@1462 1508 // We don't need barriers for initializing stores to objects
ysr@1462 1509 // in the young gen: for the SATB pre-barrier, there is no
ysr@1462 1510 // pre-value that needs to be remembered; for the remembered-set
ysr@1462 1511 // update logging post-barrier, we don't maintain remembered set
brutisso@3065 1512 // information for young gen objects.
ysr@1462 1513 virtual bool can_elide_initializing_store_barrier(oop new_obj) {
ysr@1462 1514 return is_in_young(new_obj);
ysr@777 1515 }
ysr@777 1516
ysr@777 1517 // Returns "true" iff the given word_size is "very large".
ysr@777 1518 static bool isHumongous(size_t word_size) {
johnc@1748 1519 // Note this has to be strictly greater-than as the TLABs
johnc@1748 1520 // are capped at the humongous thresold and we want to
johnc@1748 1521 // ensure that we don't try to allocate a TLAB as
johnc@1748 1522 // humongous and that we don't allocate a humongous
johnc@1748 1523 // object in a TLAB.
johnc@1748 1524 return word_size > _humongous_object_threshold_in_words;
ysr@777 1525 }
ysr@777 1526
ysr@777 1527 // Update mod union table with the set of dirty cards.
ysr@777 1528 void updateModUnion();
ysr@777 1529
ysr@777 1530 // Set the mod union bits corresponding to the given memRegion. Note
ysr@777 1531 // that this is always a safe operation, since it doesn't clear any
ysr@777 1532 // bits.
ysr@777 1533 void markModUnionRange(MemRegion mr);
ysr@777 1534
ysr@777 1535 // Records the fact that a marking phase is no longer in progress.
ysr@777 1536 void set_marking_complete() {
ysr@777 1537 _mark_in_progress = false;
ysr@777 1538 }
ysr@777 1539 void set_marking_started() {
ysr@777 1540 _mark_in_progress = true;
ysr@777 1541 }
ysr@777 1542 bool mark_in_progress() {
ysr@777 1543 return _mark_in_progress;
ysr@777 1544 }
ysr@777 1545
ysr@777 1546 // Print the maximum heap capacity.
ysr@777 1547 virtual size_t max_capacity() const;
ysr@777 1548
ysr@777 1549 virtual jlong millis_since_last_gc();
ysr@777 1550
ysr@777 1551 // Perform any cleanup actions necessary before allowing a verification.
ysr@777 1552 virtual void prepare_for_verify();
ysr@777 1553
ysr@777 1554 // Perform verification.
tonyp@1246 1555
johnc@2969 1556 // vo == UsePrevMarking -> use "prev" marking information,
johnc@2969 1557 // vo == UseNextMarking -> use "next" marking information
johnc@2969 1558 // vo == UseMarkWord -> use the mark word in the object header
johnc@2969 1559 //
tonyp@1246 1560 // NOTE: Only the "prev" marking information is guaranteed to be
tonyp@1246 1561 // consistent most of the time, so most calls to this should use
johnc@2969 1562 // vo == UsePrevMarking.
johnc@2969 1563 // Currently, there is only one case where this is called with
johnc@2969 1564 // vo == UseNextMarking, which is to verify the "next" marking
johnc@2969 1565 // information at the end of remark.
johnc@2969 1566 // Currently there is only one place where this is called with
johnc@2969 1567 // vo == UseMarkWord, which is to verify the marking during a
johnc@2969 1568 // full GC.
brutisso@3711 1569 void verify(bool silent, VerifyOption vo);
tonyp@1246 1570
tonyp@1246 1571 // Override; it uses the "prev" marking information
brutisso@3711 1572 virtual void verify(bool silent);
ysr@777 1573 virtual void print_on(outputStream* st) const;
tonyp@3269 1574 virtual void print_extended_on(outputStream* st) const;
ysr@777 1575
ysr@777 1576 virtual void print_gc_threads_on(outputStream* st) const;
ysr@777 1577 virtual void gc_threads_do(ThreadClosure* tc) const;
ysr@777 1578
ysr@777 1579 // Override
ysr@777 1580 void print_tracing_info() const;
ysr@777 1581
tonyp@2974 1582 // The following two methods are helpful for debugging RSet issues.
tonyp@2974 1583 void print_cset_rsets() PRODUCT_RETURN;
tonyp@2974 1584 void print_all_rsets() PRODUCT_RETURN;
tonyp@2974 1585
ysr@777 1586 // Convenience function to be used in situations where the heap type can be
ysr@777 1587 // asserted to be this type.
ysr@777 1588 static G1CollectedHeap* heap();
ysr@777 1589
ysr@777 1590 void set_region_short_lived_locked(HeapRegion* hr);
ysr@777 1591 // add appropriate methods for any other surv rate groups
ysr@777 1592
johnc@1829 1593 YoungList* young_list() { return _young_list; }
ysr@777 1594
ysr@777 1595 // debugging
ysr@777 1596 bool check_young_list_well_formed() {
ysr@777 1597 return _young_list->check_list_well_formed();
ysr@777 1598 }
johnc@1829 1599
johnc@1829 1600 bool check_young_list_empty(bool check_heap,
ysr@777 1601 bool check_sample = true);
ysr@777 1602
ysr@777 1603 // *** Stuff related to concurrent marking. It's not clear to me that so
ysr@777 1604 // many of these need to be public.
ysr@777 1605
ysr@777 1606 // The functions below are helper functions that a subclass of
ysr@777 1607 // "CollectedHeap" can use in the implementation of its virtual
ysr@777 1608 // functions.
ysr@777 1609 // This performs a concurrent marking of the live objects in a
ysr@777 1610 // bitmap off to the side.
ysr@777 1611 void doConcurrentMark();
ysr@777 1612
ysr@777 1613 bool isMarkedPrev(oop obj) const;
ysr@777 1614 bool isMarkedNext(oop obj) const;
ysr@777 1615
ysr@777 1616 // Determine if an object is dead, given the object and also
ysr@777 1617 // the region to which the object belongs. An object is dead
ysr@777 1618 // iff a) it was not allocated since the last mark and b) it
ysr@777 1619 // is not marked.
ysr@777 1620
ysr@777 1621 bool is_obj_dead(const oop obj, const HeapRegion* hr) const {
ysr@777 1622 return
ysr@777 1623 !hr->obj_allocated_since_prev_marking(obj) &&
ysr@777 1624 !isMarkedPrev(obj);
ysr@777 1625 }
ysr@777 1626
ysr@777 1627 // This function returns true when an object has been
ysr@777 1628 // around since the previous marking and hasn't yet
ysr@777 1629 // been marked during this marking.
ysr@777 1630
ysr@777 1631 bool is_obj_ill(const oop obj, const HeapRegion* hr) const {
ysr@777 1632 return
ysr@777 1633 !hr->obj_allocated_since_next_marking(obj) &&
ysr@777 1634 !isMarkedNext(obj);
ysr@777 1635 }
ysr@777 1636
ysr@777 1637 // Determine if an object is dead, given only the object itself.
ysr@777 1638 // This will find the region to which the object belongs and
ysr@777 1639 // then call the region version of the same function.
ysr@777 1640
ysr@777 1641 // Added if it is NULL it isn't dead.
ysr@777 1642
johnc@2969 1643 bool is_obj_dead(const oop obj) const {
tonyp@1246 1644 const HeapRegion* hr = heap_region_containing(obj);
ysr@777 1645 if (hr == NULL) {
coleenp@4037 1646 if (obj == NULL) return false;
ysr@777 1647 else return true;
ysr@777 1648 }
ysr@777 1649 else return is_obj_dead(obj, hr);
ysr@777 1650 }
ysr@777 1651
johnc@2969 1652 bool is_obj_ill(const oop obj) const {
tonyp@1246 1653 const HeapRegion* hr = heap_region_containing(obj);
ysr@777 1654 if (hr == NULL) {
coleenp@4037 1655 if (obj == NULL) return false;
ysr@777 1656 else return true;
ysr@777 1657 }
ysr@777 1658 else return is_obj_ill(obj, hr);
ysr@777 1659 }
ysr@777 1660
tonyp@3957 1661 // The methods below are here for convenience and dispatch the
tonyp@3957 1662 // appropriate method depending on value of the given VerifyOption
tonyp@3957 1663 // parameter. The options for that parameter are:
tonyp@3957 1664 //
tonyp@3957 1665 // vo == UsePrevMarking -> use "prev" marking information,
tonyp@3957 1666 // vo == UseNextMarking -> use "next" marking information,
tonyp@3957 1667 // vo == UseMarkWord -> use mark word from object header
tonyp@3957 1668
tonyp@3957 1669 bool is_obj_dead_cond(const oop obj,
tonyp@3957 1670 const HeapRegion* hr,
tonyp@3957 1671 const VerifyOption vo) const {
tonyp@3957 1672 switch (vo) {
tonyp@3957 1673 case VerifyOption_G1UsePrevMarking: return is_obj_dead(obj, hr);
tonyp@3957 1674 case VerifyOption_G1UseNextMarking: return is_obj_ill(obj, hr);
tonyp@3957 1675 case VerifyOption_G1UseMarkWord: return !obj->is_gc_marked();
tonyp@3957 1676 default: ShouldNotReachHere();
tonyp@3957 1677 }
tonyp@3957 1678 return false; // keep some compilers happy
tonyp@3957 1679 }
tonyp@3957 1680
tonyp@3957 1681 bool is_obj_dead_cond(const oop obj,
tonyp@3957 1682 const VerifyOption vo) const {
tonyp@3957 1683 switch (vo) {
tonyp@3957 1684 case VerifyOption_G1UsePrevMarking: return is_obj_dead(obj);
tonyp@3957 1685 case VerifyOption_G1UseNextMarking: return is_obj_ill(obj);
tonyp@3957 1686 case VerifyOption_G1UseMarkWord: return !obj->is_gc_marked();
tonyp@3957 1687 default: ShouldNotReachHere();
tonyp@3957 1688 }
tonyp@3957 1689 return false; // keep some compilers happy
tonyp@3957 1690 }
tonyp@3957 1691
tonyp@3957 1692 bool allocated_since_marking(oop obj, HeapRegion* hr, VerifyOption vo);
tonyp@3957 1693 HeapWord* top_at_mark_start(HeapRegion* hr, VerifyOption vo);
tonyp@3957 1694 bool is_marked(oop obj, VerifyOption vo);
tonyp@3957 1695 const char* top_at_mark_start_str(VerifyOption vo);
tonyp@3957 1696
ysr@777 1697 // The following is just to alert the verification code
ysr@777 1698 // that a full collection has occurred and that the
ysr@777 1699 // remembered sets are no longer up to date.
ysr@777 1700 bool _full_collection;
ysr@777 1701 void set_full_collection() { _full_collection = true;}
ysr@777 1702 void clear_full_collection() {_full_collection = false;}
ysr@777 1703 bool full_collection() {return _full_collection;}
ysr@777 1704
ysr@777 1705 ConcurrentMark* concurrent_mark() const { return _cm; }
ysr@777 1706 ConcurrentG1Refine* concurrent_g1_refine() const { return _cg1r; }
ysr@777 1707
apetrusenko@1231 1708 // The dirty cards region list is used to record a subset of regions
apetrusenko@1231 1709 // whose cards need clearing. The list if populated during the
apetrusenko@1231 1710 // remembered set scanning and drained during the card table
apetrusenko@1231 1711 // cleanup. Although the methods are reentrant, population/draining
apetrusenko@1231 1712 // phases must not overlap. For synchronization purposes the last
apetrusenko@1231 1713 // element on the list points to itself.
apetrusenko@1231 1714 HeapRegion* _dirty_cards_region_list;
apetrusenko@1231 1715 void push_dirty_cards_region(HeapRegion* hr);
apetrusenko@1231 1716 HeapRegion* pop_dirty_cards_region();
apetrusenko@1231 1717
ysr@777 1718 public:
ysr@777 1719 void stop_conc_gc_threads();
ysr@777 1720
ysr@777 1721 size_t pending_card_num();
ysr@777 1722 size_t cards_scanned();
ysr@777 1723
ysr@777 1724 protected:
ysr@777 1725 size_t _max_heap_capacity;
ysr@777 1726 };
ysr@777 1727
ysr@1280 1728 class G1ParGCAllocBuffer: public ParGCAllocBuffer {
ysr@1280 1729 private:
ysr@1280 1730 bool _retired;
ysr@1280 1731
ysr@1280 1732 public:
johnc@3086 1733 G1ParGCAllocBuffer(size_t gclab_word_size);
ysr@1280 1734
tonyp@3416 1735 void set_buf(HeapWord* buf) {
ysr@1280 1736 ParGCAllocBuffer::set_buf(buf);
ysr@1280 1737 _retired = false;
ysr@1280 1738 }
ysr@1280 1739
tonyp@3416 1740 void retire(bool end_of_gc, bool retain) {
ysr@1280 1741 if (_retired)
ysr@1280 1742 return;
ysr@1280 1743 ParGCAllocBuffer::retire(end_of_gc, retain);
ysr@1280 1744 _retired = true;
ysr@1280 1745 }
ysr@1280 1746 };
ysr@1280 1747
ysr@1280 1748 class G1ParScanThreadState : public StackObj {
ysr@1280 1749 protected:
ysr@1280 1750 G1CollectedHeap* _g1h;
ysr@1280 1751 RefToScanQueue* _refs;
ysr@1280 1752 DirtyCardQueue _dcq;
ysr@1280 1753 CardTableModRefBS* _ct_bs;
ysr@1280 1754 G1RemSet* _g1_rem;
ysr@1280 1755
apetrusenko@1826 1756 G1ParGCAllocBuffer _surviving_alloc_buffer;
apetrusenko@1826 1757 G1ParGCAllocBuffer _tenured_alloc_buffer;
apetrusenko@1826 1758 G1ParGCAllocBuffer* _alloc_buffers[GCAllocPurposeCount];
apetrusenko@1826 1759 ageTable _age_table;
ysr@1280 1760
ysr@1280 1761 size_t _alloc_buffer_waste;
ysr@1280 1762 size_t _undo_waste;
ysr@1280 1763
ysr@1280 1764 OopsInHeapRegionClosure* _evac_failure_cl;
ysr@1280 1765 G1ParScanHeapEvacClosure* _evac_cl;
ysr@1280 1766 G1ParScanPartialArrayClosure* _partial_scan_cl;
ysr@1280 1767
ysr@1280 1768 int _hash_seed;
johnc@3463 1769 uint _queue_num;
ysr@1280 1770
tonyp@1966 1771 size_t _term_attempts;
ysr@1280 1772
ysr@1280 1773 double _start;
ysr@1280 1774 double _start_strong_roots;
ysr@1280 1775 double _strong_roots_time;
ysr@1280 1776 double _start_term;
ysr@1280 1777 double _term_time;
ysr@1280 1778
ysr@1280 1779 // Map from young-age-index (0 == not young, 1 is youngest) to
ysr@1280 1780 // surviving words. base is what we get back from the malloc call
ysr@1280 1781 size_t* _surviving_young_words_base;
ysr@1280 1782 // this points into the array, as we use the first few entries for padding
ysr@1280 1783 size_t* _surviving_young_words;
ysr@1280 1784
jcoomes@2064 1785 #define PADDING_ELEM_NUM (DEFAULT_CACHE_LINE_SIZE / sizeof(size_t))
ysr@1280 1786
ysr@1280 1787 void add_to_alloc_buffer_waste(size_t waste) { _alloc_buffer_waste += waste; }
ysr@1280 1788
ysr@1280 1789 void add_to_undo_waste(size_t waste) { _undo_waste += waste; }
ysr@1280 1790
ysr@1280 1791 DirtyCardQueue& dirty_card_queue() { return _dcq; }
ysr@1280 1792 CardTableModRefBS* ctbs() { return _ct_bs; }
ysr@1280 1793
ysr@1280 1794 template <class T> void immediate_rs_update(HeapRegion* from, T* p, int tid) {
ysr@1280 1795 if (!from->is_survivor()) {
ysr@1280 1796 _g1_rem->par_write_ref(from, p, tid);
ysr@1280 1797 }
ysr@1280 1798 }
ysr@1280 1799
ysr@1280 1800 template <class T> void deferred_rs_update(HeapRegion* from, T* p, int tid) {
ysr@1280 1801 // If the new value of the field points to the same region or
ysr@1280 1802 // is the to-space, we don't need to include it in the Rset updates.
ysr@1280 1803 if (!from->is_in_reserved(oopDesc::load_decode_heap_oop(p)) && !from->is_survivor()) {
ysr@1280 1804 size_t card_index = ctbs()->index_for(p);
ysr@1280 1805 // If the card hasn't been added to the buffer, do it.
ysr@1280 1806 if (ctbs()->mark_card_deferred(card_index)) {
ysr@1280 1807 dirty_card_queue().enqueue((jbyte*)ctbs()->byte_for_index(card_index));
ysr@1280 1808 }
ysr@1280 1809 }
ysr@1280 1810 }
ysr@1280 1811
ysr@1280 1812 public:
johnc@3463 1813 G1ParScanThreadState(G1CollectedHeap* g1h, uint queue_num);
ysr@1280 1814
ysr@1280 1815 ~G1ParScanThreadState() {
zgu@3900 1816 FREE_C_HEAP_ARRAY(size_t, _surviving_young_words_base, mtGC);
ysr@1280 1817 }
ysr@1280 1818
ysr@1280 1819 RefToScanQueue* refs() { return _refs; }
ysr@1280 1820 ageTable* age_table() { return &_age_table; }
ysr@1280 1821
ysr@1280 1822 G1ParGCAllocBuffer* alloc_buffer(GCAllocPurpose purpose) {
apetrusenko@1826 1823 return _alloc_buffers[purpose];
ysr@1280 1824 }
ysr@1280 1825
jcoomes@2064 1826 size_t alloc_buffer_waste() const { return _alloc_buffer_waste; }
jcoomes@2064 1827 size_t undo_waste() const { return _undo_waste; }
ysr@1280 1828
jcoomes@2217 1829 #ifdef ASSERT
jcoomes@2217 1830 bool verify_ref(narrowOop* ref) const;
jcoomes@2217 1831 bool verify_ref(oop* ref) const;
jcoomes@2217 1832 bool verify_task(StarTask ref) const;
jcoomes@2217 1833 #endif // ASSERT
jcoomes@2217 1834
ysr@1280 1835 template <class T> void push_on_queue(T* ref) {
jcoomes@2217 1836 assert(verify_ref(ref), "sanity");
jcoomes@2064 1837 refs()->push(ref);
ysr@1280 1838 }
ysr@1280 1839
ysr@1280 1840 template <class T> void update_rs(HeapRegion* from, T* p, int tid) {
ysr@1280 1841 if (G1DeferredRSUpdate) {
ysr@1280 1842 deferred_rs_update(from, p, tid);
ysr@1280 1843 } else {
ysr@1280 1844 immediate_rs_update(from, p, tid);
ysr@1280 1845 }
ysr@1280 1846 }
ysr@1280 1847
ysr@1280 1848 HeapWord* allocate_slow(GCAllocPurpose purpose, size_t word_sz) {
ysr@1280 1849 HeapWord* obj = NULL;
apetrusenko@1826 1850 size_t gclab_word_size = _g1h->desired_plab_sz(purpose);
apetrusenko@1826 1851 if (word_sz * 100 < gclab_word_size * ParallelGCBufferWastePct) {
ysr@1280 1852 G1ParGCAllocBuffer* alloc_buf = alloc_buffer(purpose);
ysr@1280 1853 add_to_alloc_buffer_waste(alloc_buf->words_remaining());
johnc@4067 1854 alloc_buf->retire(false /* end_of_gc */, false /* retain */);
ysr@1280 1855
apetrusenko@1826 1856 HeapWord* buf = _g1h->par_allocate_during_gc(purpose, gclab_word_size);
ysr@1280 1857 if (buf == NULL) return NULL; // Let caller handle allocation failure.
ysr@1280 1858 // Otherwise.
johnc@3982 1859 alloc_buf->set_word_size(gclab_word_size);
ysr@1280 1860 alloc_buf->set_buf(buf);
ysr@1280 1861
ysr@1280 1862 obj = alloc_buf->allocate(word_sz);
ysr@1280 1863 assert(obj != NULL, "buffer was definitely big enough...");
ysr@1280 1864 } else {
ysr@1280 1865 obj = _g1h->par_allocate_during_gc(purpose, word_sz);
ysr@1280 1866 }
ysr@1280 1867 return obj;
ysr@1280 1868 }
ysr@1280 1869
ysr@1280 1870 HeapWord* allocate(GCAllocPurpose purpose, size_t word_sz) {
ysr@1280 1871 HeapWord* obj = alloc_buffer(purpose)->allocate(word_sz);
ysr@1280 1872 if (obj != NULL) return obj;
ysr@1280 1873 return allocate_slow(purpose, word_sz);
ysr@1280 1874 }
ysr@1280 1875
ysr@1280 1876 void undo_allocation(GCAllocPurpose purpose, HeapWord* obj, size_t word_sz) {
ysr@1280 1877 if (alloc_buffer(purpose)->contains(obj)) {
ysr@1280 1878 assert(alloc_buffer(purpose)->contains(obj + word_sz - 1),
ysr@1280 1879 "should contain whole object");
ysr@1280 1880 alloc_buffer(purpose)->undo_allocation(obj, word_sz);
ysr@1280 1881 } else {
ysr@1280 1882 CollectedHeap::fill_with_object(obj, word_sz);
ysr@1280 1883 add_to_undo_waste(word_sz);
ysr@1280 1884 }
ysr@1280 1885 }
ysr@1280 1886
ysr@1280 1887 void set_evac_failure_closure(OopsInHeapRegionClosure* evac_failure_cl) {
ysr@1280 1888 _evac_failure_cl = evac_failure_cl;
ysr@1280 1889 }
ysr@1280 1890 OopsInHeapRegionClosure* evac_failure_closure() {
ysr@1280 1891 return _evac_failure_cl;
ysr@1280 1892 }
ysr@1280 1893
ysr@1280 1894 void set_evac_closure(G1ParScanHeapEvacClosure* evac_cl) {
ysr@1280 1895 _evac_cl = evac_cl;
ysr@1280 1896 }
ysr@1280 1897
ysr@1280 1898 void set_partial_scan_closure(G1ParScanPartialArrayClosure* partial_scan_cl) {
ysr@1280 1899 _partial_scan_cl = partial_scan_cl;
ysr@1280 1900 }
ysr@1280 1901
ysr@1280 1902 int* hash_seed() { return &_hash_seed; }
johnc@3463 1903 uint queue_num() { return _queue_num; }
ysr@1280 1904
jcoomes@2064 1905 size_t term_attempts() const { return _term_attempts; }
tonyp@1966 1906 void note_term_attempt() { _term_attempts++; }
ysr@1280 1907
ysr@1280 1908 void start_strong_roots() {
ysr@1280 1909 _start_strong_roots = os::elapsedTime();
ysr@1280 1910 }
ysr@1280 1911 void end_strong_roots() {
ysr@1280 1912 _strong_roots_time += (os::elapsedTime() - _start_strong_roots);
ysr@1280 1913 }
jcoomes@2064 1914 double strong_roots_time() const { return _strong_roots_time; }
ysr@1280 1915
ysr@1280 1916 void start_term_time() {
ysr@1280 1917 note_term_attempt();
ysr@1280 1918 _start_term = os::elapsedTime();
ysr@1280 1919 }
ysr@1280 1920 void end_term_time() {
ysr@1280 1921 _term_time += (os::elapsedTime() - _start_term);
ysr@1280 1922 }
jcoomes@2064 1923 double term_time() const { return _term_time; }
ysr@1280 1924
jcoomes@2064 1925 double elapsed_time() const {
ysr@1280 1926 return os::elapsedTime() - _start;
ysr@1280 1927 }
ysr@1280 1928
jcoomes@2064 1929 static void
jcoomes@2064 1930 print_termination_stats_hdr(outputStream* const st = gclog_or_tty);
jcoomes@2064 1931 void
jcoomes@2064 1932 print_termination_stats(int i, outputStream* const st = gclog_or_tty) const;
jcoomes@2064 1933
ysr@1280 1934 size_t* surviving_young_words() {
ysr@1280 1935 // We add on to hide entry 0 which accumulates surviving words for
ysr@1280 1936 // age -1 regions (i.e. non-young ones)
ysr@1280 1937 return _surviving_young_words;
ysr@1280 1938 }
ysr@1280 1939
ysr@1280 1940 void retire_alloc_buffers() {
ysr@1280 1941 for (int ap = 0; ap < GCAllocPurposeCount; ++ap) {
apetrusenko@1826 1942 size_t waste = _alloc_buffers[ap]->words_remaining();
ysr@1280 1943 add_to_alloc_buffer_waste(waste);
johnc@3982 1944 _alloc_buffers[ap]->flush_stats_and_retire(_g1h->stats_for_purpose((GCAllocPurpose)ap),
johnc@3982 1945 true /* end_of_gc */,
johnc@3982 1946 false /* retain */);
ysr@1280 1947 }
ysr@1280 1948 }
ysr@1280 1949
ysr@1280 1950 template <class T> void deal_with_reference(T* ref_to_scan) {
ysr@1280 1951 if (has_partial_array_mask(ref_to_scan)) {
ysr@1280 1952 _partial_scan_cl->do_oop_nv(ref_to_scan);
ysr@1280 1953 } else {
ysr@1280 1954 // Note: we can use "raw" versions of "region_containing" because
ysr@1280 1955 // "obj_to_scan" is definitely in the heap, and is not in a
ysr@1280 1956 // humongous region.
ysr@1280 1957 HeapRegion* r = _g1h->heap_region_containing_raw(ref_to_scan);
ysr@1280 1958 _evac_cl->set_region(r);
ysr@1280 1959 _evac_cl->do_oop_nv(ref_to_scan);
ysr@1280 1960 }
ysr@1280 1961 }
ysr@1280 1962
jcoomes@2217 1963 void deal_with_reference(StarTask ref) {
jcoomes@2217 1964 assert(verify_task(ref), "sanity");
jcoomes@2217 1965 if (ref.is_narrow()) {
jcoomes@2217 1966 deal_with_reference((narrowOop*)ref);
jcoomes@2217 1967 } else {
jcoomes@2217 1968 deal_with_reference((oop*)ref);
ysr@1280 1969 }
ysr@1280 1970 }
jcoomes@2217 1971
jcoomes@2217 1972 public:
jcoomes@2217 1973 void trim_queue();
ysr@1280 1974 };
stefank@2314 1975
stefank@2314 1976 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1COLLECTEDHEAP_HPP

mercurial