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

Fri, 10 Oct 2014 15:51:58 +0200

author
tschatzl
date
Fri, 10 Oct 2014 15:51:58 +0200
changeset 7257
e7d0505c8a30
parent 7208
7baf47cb97cb
child 7298
ef9eda2c1abe
child 7476
c2844108a708
permissions
-rw-r--r--

8059758: Footprint regressions with JDK-8038423
Summary: Changes in JDK-8038423 always initialize (zero out) virtual memory used for auxiliary data structures. This causes a footprint regression for G1 in startup benchmarks. This is because they do not touch that memory at all, so the operating system does not actually commit these pages. The fix is to, if the initialization value of the data structures matches the default value of just committed memory (=0), do not do anything.
Reviewed-by: jwilhelm, brutisso

mgerdin@7208 1 /*
tschatzl@6402 2 * Copyright (c) 2001, 2014, 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
sjohanss@7118 28 #include "gc_implementation/g1/g1AllocationContext.hpp"
sjohanss@7118 29 #include "gc_implementation/g1/g1Allocator.hpp"
stefank@2314 30 #include "gc_implementation/g1/concurrentMark.hpp"
sla@5237 31 #include "gc_implementation/g1/evacuationInfo.hpp"
tonyp@2715 32 #include "gc_implementation/g1/g1AllocRegion.hpp"
tschatzl@6926 33 #include "gc_implementation/g1/g1BiasedArray.hpp"
tonyp@2975 34 #include "gc_implementation/g1/g1HRPrinter.hpp"
sla@5237 35 #include "gc_implementation/g1/g1MonitoringSupport.hpp"
mgerdin@5811 36 #include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp"
sla@5237 37 #include "gc_implementation/g1/g1YCTypes.hpp"
tschatzl@7091 38 #include "gc_implementation/g1/heapRegionManager.hpp"
brutisso@6385 39 #include "gc_implementation/g1/heapRegionSet.hpp"
jmasa@2821 40 #include "gc_implementation/shared/hSpaceCounters.hpp"
johnc@3982 41 #include "gc_implementation/shared/parGCAllocBuffer.hpp"
stefank@2314 42 #include "memory/barrierSet.hpp"
stefank@2314 43 #include "memory/memRegion.hpp"
stefank@2314 44 #include "memory/sharedHeap.hpp"
brutisso@4579 45 #include "utilities/stack.hpp"
stefank@2314 46
ysr@777 47 // A "G1CollectedHeap" is an implementation of a java heap for HotSpot.
ysr@777 48 // It uses the "Garbage First" heap organization and algorithm, which
ysr@777 49 // may combine concurrent marking with parallel, incremental compaction of
ysr@777 50 // heap subsets that will yield large amounts of garbage.
ysr@777 51
johnc@5548 52 // Forward declarations
ysr@777 53 class HeapRegion;
tonyp@2493 54 class HRRSCleanupTask;
ysr@777 55 class GenerationSpec;
ysr@777 56 class OopsInHeapRegionClosure;
coleenp@4037 57 class G1KlassScanClosure;
ysr@777 58 class G1ScanHeapEvacClosure;
ysr@777 59 class ObjectClosure;
ysr@777 60 class SpaceClosure;
ysr@777 61 class CompactibleSpaceClosure;
ysr@777 62 class Space;
ysr@777 63 class G1CollectorPolicy;
ysr@777 64 class GenRemSet;
ysr@777 65 class G1RemSet;
ysr@777 66 class HeapRegionRemSetIterator;
ysr@777 67 class ConcurrentMark;
ysr@777 68 class ConcurrentMarkThread;
ysr@777 69 class ConcurrentG1Refine;
sla@5237 70 class ConcurrentGCTimer;
jmasa@2821 71 class GenerationCounters;
sla@5237 72 class STWGCTimer;
sla@5237 73 class G1NewTracer;
sla@5237 74 class G1OldTracer;
sla@5237 75 class EvacuationFailedInfo;
johnc@5548 76 class nmethod;
mgronlun@6131 77 class Ticks;
ysr@777 78
zgu@3900 79 typedef OverflowTaskQueue<StarTask, mtGC> RefToScanQueue;
zgu@3900 80 typedef GenericTaskQueueSet<RefToScanQueue, mtGC> RefToScanQueueSet;
ysr@777 81
johnc@1242 82 typedef int RegionIdx_t; // needs to hold [ 0..max_regions() )
johnc@1242 83 typedef int CardIdx_t; // needs to hold [ 0..CardsPerRegion )
johnc@1242 84
zgu@3900 85 class YoungList : public CHeapObj<mtGC> {
ysr@777 86 private:
ysr@777 87 G1CollectedHeap* _g1h;
ysr@777 88
ysr@777 89 HeapRegion* _head;
ysr@777 90
johnc@1829 91 HeapRegion* _survivor_head;
johnc@1829 92 HeapRegion* _survivor_tail;
johnc@1829 93
johnc@1829 94 HeapRegion* _curr;
johnc@1829 95
tonyp@3713 96 uint _length;
tonyp@3713 97 uint _survivor_length;
ysr@777 98
ysr@777 99 size_t _last_sampled_rs_lengths;
ysr@777 100 size_t _sampled_rs_lengths;
ysr@777 101
johnc@1829 102 void empty_list(HeapRegion* list);
ysr@777 103
ysr@777 104 public:
ysr@777 105 YoungList(G1CollectedHeap* g1h);
ysr@777 106
johnc@1829 107 void push_region(HeapRegion* hr);
johnc@1829 108 void add_survivor_region(HeapRegion* hr);
johnc@1829 109
johnc@1829 110 void empty_list();
johnc@1829 111 bool is_empty() { return _length == 0; }
tonyp@3713 112 uint length() { return _length; }
tonyp@3713 113 uint survivor_length() { return _survivor_length; }
ysr@777 114
tonyp@2961 115 // Currently we do not keep track of the used byte sum for the
tonyp@2961 116 // young list and the survivors and it'd be quite a lot of work to
tonyp@2961 117 // do so. When we'll eventually replace the young list with
tonyp@2961 118 // instances of HeapRegionLinkedList we'll get that for free. So,
tonyp@2961 119 // we'll report the more accurate information then.
tonyp@2961 120 size_t eden_used_bytes() {
tonyp@2961 121 assert(length() >= survivor_length(), "invariant");
tonyp@3713 122 return (size_t) (length() - survivor_length()) * HeapRegion::GrainBytes;
tonyp@2961 123 }
tonyp@2961 124 size_t survivor_used_bytes() {
tonyp@3713 125 return (size_t) survivor_length() * HeapRegion::GrainBytes;
tonyp@2961 126 }
tonyp@2961 127
ysr@777 128 void rs_length_sampling_init();
ysr@777 129 bool rs_length_sampling_more();
ysr@777 130 void rs_length_sampling_next();
ysr@777 131
ysr@777 132 void reset_sampled_info() {
ysr@777 133 _last_sampled_rs_lengths = 0;
ysr@777 134 }
ysr@777 135 size_t sampled_rs_lengths() { return _last_sampled_rs_lengths; }
ysr@777 136
ysr@777 137 // for development purposes
ysr@777 138 void reset_auxilary_lists();
johnc@1829 139 void clear() { _head = NULL; _length = 0; }
johnc@1829 140
johnc@1829 141 void clear_survivors() {
johnc@1829 142 _survivor_head = NULL;
johnc@1829 143 _survivor_tail = NULL;
johnc@1829 144 _survivor_length = 0;
johnc@1829 145 }
johnc@1829 146
ysr@777 147 HeapRegion* first_region() { return _head; }
ysr@777 148 HeapRegion* first_survivor_region() { return _survivor_head; }
apetrusenko@980 149 HeapRegion* last_survivor_region() { return _survivor_tail; }
ysr@777 150
ysr@777 151 // debugging
ysr@777 152 bool check_list_well_formed();
johnc@1829 153 bool check_list_empty(bool check_sample = true);
ysr@777 154 void print();
ysr@777 155 };
ysr@777 156
johnc@5548 157 // The G1 STW is alive closure.
johnc@5548 158 // An instance is embedded into the G1CH and used as the
johnc@5548 159 // (optional) _is_alive_non_header closure in the STW
johnc@5548 160 // reference processor. It is also extensively used during
johnc@5548 161 // reference processing during STW evacuation pauses.
johnc@5548 162 class G1STWIsAliveClosure: public BoolObjectClosure {
johnc@5548 163 G1CollectedHeap* _g1;
johnc@5548 164 public:
johnc@5548 165 G1STWIsAliveClosure(G1CollectedHeap* g1) : _g1(g1) {}
johnc@5548 166 bool do_object_b(oop p);
johnc@5548 167 };
johnc@5548 168
ysr@777 169 class RefineCardTableEntryClosure;
johnc@3175 170
tschatzl@7051 171 class G1RegionMappingChangedListener : public G1MappingChangedListener {
tschatzl@7051 172 private:
tschatzl@7051 173 void reset_from_card_cache(uint start_idx, size_t num_regions);
tschatzl@7051 174 public:
tschatzl@7257 175 virtual void on_commit(uint start_idx, size_t num_regions, bool zero_filled);
tschatzl@7051 176 };
tschatzl@7051 177
ysr@777 178 class G1CollectedHeap : public SharedHeap {
stefank@6992 179 friend class VM_CollectForMetadataAllocation;
ysr@777 180 friend class VM_G1CollectForAllocation;
ysr@777 181 friend class VM_G1CollectFull;
ysr@777 182 friend class VM_G1IncCollectionPause;
ysr@777 183 friend class VMStructs;
tonyp@2715 184 friend class MutatorAllocRegion;
tonyp@3028 185 friend class SurvivorGCAllocRegion;
tonyp@3028 186 friend class OldGCAllocRegion;
sjohanss@7118 187 friend class G1Allocator;
sjohanss@7118 188 friend class G1DefaultAllocator;
sjohanss@7118 189 friend class G1ResManAllocator;
ysr@777 190
ysr@777 191 // Closures used in implementation.
stefank@6992 192 template <G1Barrier barrier, G1Mark do_mark_object>
brutisso@3690 193 friend class G1ParCopyClosure;
ysr@777 194 friend class G1IsAliveClosure;
ysr@777 195 friend class G1EvacuateFollowersClosure;
ysr@777 196 friend class G1ParScanThreadState;
ysr@777 197 friend class G1ParScanClosureSuper;
ysr@777 198 friend class G1ParEvacuateFollowersClosure;
ysr@777 199 friend class G1ParTask;
sjohanss@7118 200 friend class G1ParGCAllocator;
sjohanss@7118 201 friend class G1DefaultParGCAllocator;
ysr@777 202 friend class G1FreeGarbageRegionClosure;
ysr@777 203 friend class RefineCardTableEntryClosure;
ysr@777 204 friend class G1PrepareCompactClosure;
ysr@777 205 friend class RegionSorter;
tonyp@2472 206 friend class RegionResetter;
ysr@777 207 friend class CountRCClosure;
ysr@777 208 friend class EvacPopObjClosure;
apetrusenko@1231 209 friend class G1ParCleanupCTTask;
ysr@777 210
tschatzl@7019 211 friend class G1FreeHumongousRegionClosure;
ysr@777 212 // Other related classes.
ysr@777 213 friend class G1MarkSweep;
ysr@777 214
ysr@777 215 private:
ysr@777 216 // The one and only G1CollectedHeap, so static functions can find it.
ysr@777 217 static G1CollectedHeap* _g1h;
ysr@777 218
tonyp@1377 219 static size_t _humongous_object_threshold_in_words;
tonyp@1377 220
tonyp@2472 221 // The secondary free list which contains regions that have been
tschatzl@7050 222 // freed up during the cleanup process. This will be appended to
tschatzl@7050 223 // the master free list when appropriate.
brutisso@6385 224 FreeRegionList _secondary_free_list;
tonyp@2472 225
tonyp@3268 226 // It keeps track of the old regions.
brutisso@6385 227 HeapRegionSet _old_set;
tonyp@3268 228
tonyp@2472 229 // It keeps track of the humongous regions.
brutisso@6385 230 HeapRegionSet _humongous_set;
ysr@777 231
tschatzl@7019 232 void clear_humongous_is_live_table();
tschatzl@7019 233 void eagerly_reclaim_humongous_regions();
tschatzl@7019 234
ysr@777 235 // The number of regions we could create by expansion.
tonyp@3713 236 uint _expansion_regions;
ysr@777 237
ysr@777 238 // The block offset table for the G1 heap.
ysr@777 239 G1BlockOffsetSharedArray* _bot_shared;
ysr@777 240
tonyp@3268 241 // Tears down the region sets / lists so that they are empty and the
tonyp@3268 242 // regions on the heap do not belong to a region set / list. The
tonyp@3268 243 // only exception is the humongous set which we leave unaltered. If
tonyp@3268 244 // free_list_only is true, it will only tear down the master free
tonyp@3268 245 // list. It is called before a Full GC (free_list_only == false) or
tonyp@3268 246 // before heap shrinking (free_list_only == true).
tonyp@3268 247 void tear_down_region_sets(bool free_list_only);
tonyp@3268 248
tonyp@3268 249 // Rebuilds the region sets / lists so that they are repopulated to
tonyp@3268 250 // reflect the contents of the heap. The only exception is the
tonyp@3268 251 // humongous set which was not torn down in the first place. If
tonyp@3268 252 // free_list_only is true, it will only rebuild the master free
tonyp@3268 253 // list. It is called after a Full GC (free_list_only == false) or
tonyp@3268 254 // after heap shrinking (free_list_only == true).
tonyp@3268 255 void rebuild_region_sets(bool free_list_only);
ysr@777 256
tschatzl@7051 257 // Callback for region mapping changed events.
tschatzl@7051 258 G1RegionMappingChangedListener _listener;
tschatzl@7051 259
ysr@777 260 // The sequence of all heap regions in the heap.
tschatzl@7091 261 HeapRegionManager _hrm;
ysr@777 262
sjohanss@7118 263 // Class that handles the different kinds of allocations.
sjohanss@7118 264 G1Allocator* _allocator;
tonyp@3028 265
jcoomes@7159 266 // Statistics for each allocation context
jcoomes@7159 267 AllocationContextStats _allocation_context_stats;
jcoomes@7159 268
johnc@3982 269 // PLAB sizing policy for survivors.
johnc@3982 270 PLABStats _survivor_plab_stats;
johnc@3982 271
johnc@3982 272 // PLAB sizing policy for tenured objects.
johnc@3982 273 PLABStats _old_plab_stats;
johnc@3982 274
tonyp@3410 275 // It specifies whether we should attempt to expand the heap after a
tonyp@3410 276 // region allocation failure. If heap expansion fails we set this to
tonyp@3410 277 // false so that we don't re-attempt the heap expansion (it's likely
tonyp@3410 278 // that subsequent expansion attempts will also fail if one fails).
tonyp@3410 279 // Currently, it is only consulted during GC and it's reset at the
tonyp@3410 280 // start of each GC.
tonyp@3410 281 bool _expand_heap_after_alloc_failure;
tonyp@3410 282
tonyp@2715 283 // It resets the mutator alloc region before new allocations can take place.
tonyp@2715 284 void init_mutator_alloc_region();
tonyp@2715 285
tonyp@2715 286 // It releases the mutator alloc region.
tonyp@2715 287 void release_mutator_alloc_region();
tonyp@2715 288
tonyp@3028 289 // It initializes the GC alloc regions at the start of a GC.
sla@5237 290 void init_gc_alloc_regions(EvacuationInfo& evacuation_info);
tonyp@3028 291
tonyp@3028 292 // It releases the GC alloc regions at the end of a GC.
sla@5237 293 void release_gc_alloc_regions(uint no_of_gc_workers, EvacuationInfo& evacuation_info);
tonyp@3028 294
tonyp@3028 295 // It does any cleanup that needs to be done on the GC alloc regions
tonyp@3028 296 // before a Full GC.
tonyp@1071 297 void abandon_gc_alloc_regions();
ysr@777 298
jmasa@2821 299 // Helper for monitoring and management support.
jmasa@2821 300 G1MonitoringSupport* _g1mm;
jmasa@2821 301
tschatzl@7019 302 // Records whether the region at the given index is kept live by roots or
tschatzl@7019 303 // references from the young generation.
tschatzl@7019 304 class HumongousIsLiveBiasedMappedArray : public G1BiasedMappedArray<bool> {
tschatzl@7019 305 protected:
tschatzl@7019 306 bool default_value() const { return false; }
tschatzl@7019 307 public:
tschatzl@7019 308 void clear() { G1BiasedMappedArray<bool>::clear(); }
tschatzl@7019 309 void set_live(uint region) {
tschatzl@7019 310 set_by_index(region, true);
tschatzl@7019 311 }
tschatzl@7019 312 bool is_live(uint region) {
tschatzl@7019 313 return get_by_index(region);
tschatzl@7019 314 }
tschatzl@7019 315 };
tschatzl@7019 316
tschatzl@7019 317 HumongousIsLiveBiasedMappedArray _humongous_is_live;
tschatzl@7019 318 // Stores whether during humongous object registration we found candidate regions.
tschatzl@7019 319 // If not, we can skip a few steps.
tschatzl@7019 320 bool _has_humongous_reclaim_candidates;
tonyp@961 321
iveresov@788 322 volatile unsigned _gc_time_stamp;
ysr@777 323
ysr@777 324 size_t* _surviving_young_words;
ysr@777 325
tonyp@2975 326 G1HRPrinter _hr_printer;
tonyp@2975 327
ysr@777 328 void setup_surviving_young_words();
ysr@777 329 void update_surviving_young_words(size_t* surv_young_words);
ysr@777 330 void cleanup_surviving_young_words();
ysr@777 331
tonyp@2011 332 // It decides whether an explicit GC should start a concurrent cycle
tonyp@2011 333 // instead of doing a STW GC. Currently, a concurrent cycle is
tonyp@2011 334 // explicitly started if:
tonyp@2011 335 // (a) cause == _gc_locker and +GCLockerInvokesConcurrent, or
tonyp@2011 336 // (b) cause == _java_lang_system_gc and +ExplicitGCInvokesConcurrent.
brutisso@3456 337 // (c) cause == _g1_humongous_allocation
tonyp@2011 338 bool should_do_concurrent_full_gc(GCCause::Cause cause);
tonyp@2011 339
brutisso@3823 340 // Keeps track of how many "old marking cycles" (i.e., Full GCs or
brutisso@3823 341 // concurrent cycles) we have started.
brutisso@3823 342 volatile unsigned int _old_marking_cycles_started;
brutisso@3823 343
brutisso@3823 344 // Keeps track of how many "old marking cycles" (i.e., Full GCs or
brutisso@3823 345 // concurrent cycles) we have completed.
brutisso@3823 346 volatile unsigned int _old_marking_cycles_completed;
tonyp@2011 347
sla@5237 348 bool _concurrent_cycle_started;
sla@5237 349
tonyp@2817 350 // This is a non-product method that is helpful for testing. It is
tonyp@2817 351 // called at the end of a GC and artificially expands the heap by
tonyp@2817 352 // allocating a number of dead regions. This way we can induce very
tonyp@2817 353 // frequent marking cycles and stress the cleanup / concurrent
tonyp@2817 354 // cleanup code more (as all the regions that will be allocated by
tonyp@2817 355 // this method will be found dead by the marking cycle).
tonyp@2817 356 void allocate_dummy_regions() PRODUCT_RETURN;
tonyp@2817 357
tonyp@3957 358 // Clear RSets after a compaction. It also resets the GC time stamps.
tonyp@3957 359 void clear_rsets_post_compaction();
tonyp@3957 360
tonyp@3957 361 // If the HR printer is active, dump the state of the regions in the
tonyp@3957 362 // heap after a compaction.
tschatzl@7091 363 void print_hrm_post_compaction();
tonyp@3957 364
brutisso@4015 365 double verify(bool guard, const char* msg);
brutisso@4015 366 void verify_before_gc();
brutisso@4015 367 void verify_after_gc();
brutisso@4015 368
brutisso@4063 369 void log_gc_header();
brutisso@4063 370 void log_gc_footer(double pause_time_sec);
brutisso@4063 371
tonyp@2315 372 // These are macros so that, if the assert fires, we get the correct
tonyp@2315 373 // line number, file, etc.
tonyp@2315 374
tonyp@2643 375 #define heap_locking_asserts_err_msg(_extra_message_) \
tonyp@2472 376 err_msg("%s : Heap_lock locked: %s, at safepoint: %s, is VM thread: %s", \
tonyp@2643 377 (_extra_message_), \
tonyp@2472 378 BOOL_TO_STR(Heap_lock->owned_by_self()), \
tonyp@2472 379 BOOL_TO_STR(SafepointSynchronize::is_at_safepoint()), \
tonyp@2472 380 BOOL_TO_STR(Thread::current()->is_VM_thread()))
tonyp@2315 381
tonyp@2315 382 #define assert_heap_locked() \
tonyp@2315 383 do { \
tonyp@2315 384 assert(Heap_lock->owned_by_self(), \
tonyp@2315 385 heap_locking_asserts_err_msg("should be holding the Heap_lock")); \
tonyp@2315 386 } while (0)
tonyp@2315 387
tonyp@2643 388 #define assert_heap_locked_or_at_safepoint(_should_be_vm_thread_) \
tonyp@2315 389 do { \
tonyp@2315 390 assert(Heap_lock->owned_by_self() || \
tonyp@2472 391 (SafepointSynchronize::is_at_safepoint() && \
tonyp@2643 392 ((_should_be_vm_thread_) == Thread::current()->is_VM_thread())), \
tonyp@2315 393 heap_locking_asserts_err_msg("should be holding the Heap_lock or " \
tonyp@2315 394 "should be at a safepoint")); \
tonyp@2315 395 } while (0)
tonyp@2315 396
tonyp@2315 397 #define assert_heap_locked_and_not_at_safepoint() \
tonyp@2315 398 do { \
tonyp@2315 399 assert(Heap_lock->owned_by_self() && \
tonyp@2315 400 !SafepointSynchronize::is_at_safepoint(), \
tonyp@2315 401 heap_locking_asserts_err_msg("should be holding the Heap_lock and " \
tonyp@2315 402 "should not be at a safepoint")); \
tonyp@2315 403 } while (0)
tonyp@2315 404
tonyp@2315 405 #define assert_heap_not_locked() \
tonyp@2315 406 do { \
tonyp@2315 407 assert(!Heap_lock->owned_by_self(), \
tonyp@2315 408 heap_locking_asserts_err_msg("should not be holding the Heap_lock")); \
tonyp@2315 409 } while (0)
tonyp@2315 410
tonyp@2315 411 #define assert_heap_not_locked_and_not_at_safepoint() \
tonyp@2315 412 do { \
tonyp@2315 413 assert(!Heap_lock->owned_by_self() && \
tonyp@2315 414 !SafepointSynchronize::is_at_safepoint(), \
tonyp@2315 415 heap_locking_asserts_err_msg("should not be holding the Heap_lock and " \
tonyp@2315 416 "should not be at a safepoint")); \
tonyp@2315 417 } while (0)
tonyp@2315 418
tonyp@2643 419 #define assert_at_safepoint(_should_be_vm_thread_) \
tonyp@2315 420 do { \
tonyp@2472 421 assert(SafepointSynchronize::is_at_safepoint() && \
tonyp@2643 422 ((_should_be_vm_thread_) == Thread::current()->is_VM_thread()), \
tonyp@2315 423 heap_locking_asserts_err_msg("should be at a safepoint")); \
tonyp@2315 424 } while (0)
tonyp@2315 425
tonyp@2315 426 #define assert_not_at_safepoint() \
tonyp@2315 427 do { \
tonyp@2315 428 assert(!SafepointSynchronize::is_at_safepoint(), \
tonyp@2315 429 heap_locking_asserts_err_msg("should not be at a safepoint")); \
tonyp@2315 430 } while (0)
tonyp@2315 431
ysr@777 432 protected:
ysr@777 433
johnc@3021 434 // The young region list.
ysr@777 435 YoungList* _young_list;
ysr@777 436
ysr@777 437 // The current policy object for the collector.
ysr@777 438 G1CollectorPolicy* _g1_policy;
ysr@777 439
tonyp@2472 440 // This is the second level of trying to allocate a new region. If
tonyp@2715 441 // new_region() didn't find a region on the free_list, this call will
tonyp@2715 442 // check whether there's anything available on the
tonyp@2715 443 // secondary_free_list and/or wait for more regions to appear on
tonyp@2715 444 // that list, if _free_regions_coming is set.
jwilhelm@6422 445 HeapRegion* new_region_try_secondary_free_list(bool is_old);
ysr@777 446
tonyp@2643 447 // Try to allocate a single non-humongous HeapRegion sufficient for
tonyp@2643 448 // an allocation of the given word_size. If do_expand is true,
tonyp@2643 449 // attempt to expand the heap if necessary to satisfy the allocation
jwilhelm@6422 450 // request. If the region is to be used as an old region or for a
jwilhelm@6422 451 // humongous object, set is_old to true. If not, to false.
jwilhelm@6422 452 HeapRegion* new_region(size_t word_size, bool is_old, bool do_expand);
ysr@777 453
tonyp@2643 454 // Initialize a contiguous set of free regions of length num_regions
tonyp@2643 455 // and starting at index first so that they appear as a single
tonyp@2643 456 // humongous region.
tonyp@3713 457 HeapWord* humongous_obj_allocate_initialize_regions(uint first,
tonyp@3713 458 uint num_regions,
sjohanss@7118 459 size_t word_size,
sjohanss@7118 460 AllocationContext_t context);
tonyp@2643 461
tonyp@2643 462 // Attempt to allocate a humongous object of the given size. Return
tonyp@2643 463 // NULL if unsuccessful.
sjohanss@7118 464 HeapWord* humongous_obj_allocate(size_t word_size, AllocationContext_t context);
ysr@777 465
tonyp@2315 466 // The following two methods, allocate_new_tlab() and
tonyp@2315 467 // mem_allocate(), are the two main entry points from the runtime
tonyp@2315 468 // into the G1's allocation routines. They have the following
tonyp@2315 469 // assumptions:
tonyp@2315 470 //
tonyp@2315 471 // * They should both be called outside safepoints.
tonyp@2315 472 //
tonyp@2315 473 // * They should both be called without holding the Heap_lock.
tonyp@2315 474 //
tonyp@2315 475 // * All allocation requests for new TLABs should go to
tonyp@2315 476 // allocate_new_tlab().
tonyp@2315 477 //
tonyp@2971 478 // * All non-TLAB allocation requests should go to mem_allocate().
tonyp@2315 479 //
tonyp@2315 480 // * If either call cannot satisfy the allocation request using the
tonyp@2315 481 // current allocating region, they will try to get a new one. If
tonyp@2315 482 // this fails, they will attempt to do an evacuation pause and
tonyp@2315 483 // retry the allocation.
tonyp@2315 484 //
tonyp@2315 485 // * If all allocation attempts fail, even after trying to schedule
tonyp@2315 486 // an evacuation pause, allocate_new_tlab() will return NULL,
tonyp@2315 487 // whereas mem_allocate() will attempt a heap expansion and/or
tonyp@2315 488 // schedule a Full GC.
tonyp@2315 489 //
tonyp@2315 490 // * We do not allow humongous-sized TLABs. So, allocate_new_tlab
tonyp@2315 491 // should never be called with word_size being humongous. All
tonyp@2315 492 // humongous allocation requests should go to mem_allocate() which
tonyp@2315 493 // will satisfy them with a special path.
ysr@777 494
tonyp@2315 495 virtual HeapWord* allocate_new_tlab(size_t word_size);
tonyp@2315 496
tonyp@2315 497 virtual HeapWord* mem_allocate(size_t word_size,
tonyp@2315 498 bool* gc_overhead_limit_was_exceeded);
tonyp@2315 499
tonyp@2715 500 // The following three methods take a gc_count_before_ret
tonyp@2715 501 // parameter which is used to return the GC count if the method
tonyp@2715 502 // returns NULL. Given that we are required to read the GC count
tonyp@2715 503 // while holding the Heap_lock, and these paths will take the
tonyp@2715 504 // Heap_lock at some point, it's easier to get them to read the GC
tonyp@2715 505 // count while holding the Heap_lock before they return NULL instead
tonyp@2715 506 // of the caller (namely: mem_allocate()) having to also take the
tonyp@2715 507 // Heap_lock just to read the GC count.
tonyp@2315 508
tonyp@2715 509 // First-level mutator allocation attempt: try to allocate out of
tonyp@2715 510 // the mutator alloc region without taking the Heap_lock. This
tonyp@2715 511 // should only be used for non-humongous allocations.
tonyp@2715 512 inline HeapWord* attempt_allocation(size_t word_size,
mgerdin@4853 513 unsigned int* gc_count_before_ret,
mgerdin@4853 514 int* gclocker_retry_count_ret);
tonyp@2315 515
tonyp@2715 516 // Second-level mutator allocation attempt: take the Heap_lock and
tonyp@2715 517 // retry the allocation attempt, potentially scheduling a GC
tonyp@2715 518 // pause. This should only be used for non-humongous allocations.
tonyp@2715 519 HeapWord* attempt_allocation_slow(size_t word_size,
sjohanss@7118 520 AllocationContext_t context,
mgerdin@4853 521 unsigned int* gc_count_before_ret,
mgerdin@4853 522 int* gclocker_retry_count_ret);
tonyp@2315 523
tonyp@2715 524 // Takes the Heap_lock and attempts a humongous allocation. It can
tonyp@2715 525 // potentially schedule a GC pause.
tonyp@2715 526 HeapWord* attempt_allocation_humongous(size_t word_size,
mgerdin@4853 527 unsigned int* gc_count_before_ret,
mgerdin@4853 528 int* gclocker_retry_count_ret);
tonyp@2454 529
tonyp@2715 530 // Allocation attempt that should be called during safepoints (e.g.,
tonyp@2715 531 // at the end of a successful GC). expect_null_mutator_alloc_region
tonyp@2715 532 // specifies whether the mutator alloc region is expected to be NULL
tonyp@2715 533 // or not.
tonyp@2315 534 HeapWord* attempt_allocation_at_safepoint(size_t word_size,
sjohanss@7118 535 AllocationContext_t context,
sjohanss@7118 536 bool expect_null_mutator_alloc_region);
tonyp@2315 537
tonyp@2315 538 // It dirties the cards that cover the block so that so that the post
tonyp@2315 539 // write barrier never queues anything when updating objects on this
tonyp@2315 540 // block. It is assumed (and in fact we assert) that the block
tonyp@2315 541 // belongs to a young region.
tonyp@2315 542 inline void dirty_young_block(HeapWord* start, size_t word_size);
ysr@777 543
ysr@777 544 // Allocate blocks during garbage collection. Will ensure an
ysr@777 545 // allocation region, either by picking one or expanding the
ysr@777 546 // heap, and then allocate a block of the given size. The block
ysr@777 547 // may not be a humongous - it must fit into a single heap region.
sjohanss@7118 548 HeapWord* par_allocate_during_gc(GCAllocPurpose purpose,
sjohanss@7118 549 size_t word_size,
sjohanss@7118 550 AllocationContext_t context);
ysr@777 551
tschatzl@6332 552 HeapWord* allocate_during_gc_slow(GCAllocPurpose purpose,
tschatzl@6332 553 HeapRegion* alloc_region,
tschatzl@6332 554 bool par,
tschatzl@6332 555 size_t word_size);
tschatzl@6332 556
ysr@777 557 // Ensure that no further allocations can happen in "r", bearing in mind
ysr@777 558 // that parallel threads might be attempting allocations.
ysr@777 559 void par_allocate_remaining_space(HeapRegion* r);
ysr@777 560
tonyp@3028 561 // Allocation attempt during GC for a survivor object / PLAB.
sjohanss@7118 562 inline HeapWord* survivor_attempt_allocation(size_t word_size,
sjohanss@7118 563 AllocationContext_t context);
apetrusenko@980 564
tonyp@3028 565 // Allocation attempt during GC for an old object / PLAB.
sjohanss@7118 566 inline HeapWord* old_attempt_allocation(size_t word_size,
sjohanss@7118 567 AllocationContext_t context);
tonyp@2715 568
tonyp@3028 569 // These methods are the "callbacks" from the G1AllocRegion class.
tonyp@3028 570
tonyp@3028 571 // For mutator alloc regions.
tonyp@2715 572 HeapRegion* new_mutator_alloc_region(size_t word_size, bool force);
tonyp@2715 573 void retire_mutator_alloc_region(HeapRegion* alloc_region,
tonyp@2715 574 size_t allocated_bytes);
tonyp@2715 575
tonyp@3028 576 // For GC alloc regions.
tonyp@3713 577 HeapRegion* new_gc_alloc_region(size_t word_size, uint count,
tonyp@3028 578 GCAllocPurpose ap);
tonyp@3028 579 void retire_gc_alloc_region(HeapRegion* alloc_region,
tonyp@3028 580 size_t allocated_bytes, GCAllocPurpose ap);
tonyp@3028 581
tonyp@2011 582 // - if explicit_gc is true, the GC is for a System.gc() or a heap
tonyp@2315 583 // inspection request and should collect the entire heap
tonyp@2315 584 // - if clear_all_soft_refs is true, all soft references should be
tonyp@2315 585 // cleared during the GC
tonyp@2011 586 // - if explicit_gc is false, word_size describes the allocation that
tonyp@2315 587 // the GC should attempt (at least) to satisfy
tonyp@2315 588 // - it returns false if it is unable to do the collection due to the
tonyp@2315 589 // GC locker being active, true otherwise
tonyp@2315 590 bool do_collection(bool explicit_gc,
tonyp@2011 591 bool clear_all_soft_refs,
ysr@777 592 size_t word_size);
ysr@777 593
ysr@777 594 // Callback from VM_G1CollectFull operation.
ysr@777 595 // Perform a full collection.
coleenp@4037 596 virtual void do_full_collection(bool clear_all_soft_refs);
ysr@777 597
ysr@777 598 // Resize the heap if necessary after a full collection. If this is
ysr@777 599 // after a collect-for allocation, "word_size" is the allocation size,
ysr@777 600 // and will be considered part of the used portion of the heap.
ysr@777 601 void resize_if_necessary_after_full_collection(size_t word_size);
ysr@777 602
ysr@777 603 // Callback from VM_G1CollectForAllocation operation.
ysr@777 604 // This function does everything necessary/possible to satisfy a
ysr@777 605 // failed allocation request (including collection, expansion, etc.)
sjohanss@7118 606 HeapWord* satisfy_failed_allocation(size_t word_size,
sjohanss@7118 607 AllocationContext_t context,
sjohanss@7118 608 bool* succeeded);
ysr@777 609
ysr@777 610 // Attempting to expand the heap sufficiently
ysr@777 611 // to support an allocation of the given "word_size". If
ysr@777 612 // successful, perform the allocation and return the address of the
ysr@777 613 // allocated block, or else "NULL".
sjohanss@7118 614 HeapWord* expand_and_allocate(size_t word_size, AllocationContext_t context);
ysr@777 615
johnc@3175 616 // Process any reference objects discovered during
johnc@3175 617 // an incremental evacuation pause.
johnc@4130 618 void process_discovered_references(uint no_of_gc_workers);
johnc@3175 619
johnc@3175 620 // Enqueue any remaining discovered references
johnc@3175 621 // after processing.
johnc@4130 622 void enqueue_discovered_references(uint no_of_gc_workers);
johnc@3175 623
ysr@777 624 public:
jmasa@2821 625
sjohanss@7131 626 G1Allocator* allocator() {
sjohanss@7131 627 return _allocator;
sjohanss@7131 628 }
sjohanss@7131 629
tonyp@3176 630 G1MonitoringSupport* g1mm() {
tonyp@3176 631 assert(_g1mm != NULL, "should have been initialized");
tonyp@3176 632 return _g1mm;
tonyp@3176 633 }
jmasa@2821 634
ysr@777 635 // Expand the garbage-first heap by at least the given size (in bytes!).
johnc@2504 636 // Returns true if the heap was expanded by the requested amount;
johnc@2504 637 // false otherwise.
ysr@777 638 // (Rounds up to a HeapRegion boundary.)
johnc@2504 639 bool expand(size_t expand_bytes);
ysr@777 640
sjohanss@7118 641 // Returns the PLAB statistics given a purpose.
sjohanss@7118 642 PLABStats* stats_for_purpose(GCAllocPurpose purpose) {
sjohanss@7118 643 PLABStats* stats = NULL;
sjohanss@7118 644
sjohanss@7118 645 switch (purpose) {
sjohanss@7118 646 case GCAllocForSurvived:
sjohanss@7118 647 stats = &_survivor_plab_stats;
sjohanss@7118 648 break;
sjohanss@7118 649 case GCAllocForTenured:
sjohanss@7118 650 stats = &_old_plab_stats;
sjohanss@7118 651 break;
sjohanss@7118 652 default:
sjohanss@7118 653 assert(false, "unrecognized GCAllocPurpose");
sjohanss@7118 654 }
sjohanss@7118 655
sjohanss@7118 656 return stats;
sjohanss@7118 657 }
sjohanss@7118 658
sjohanss@7118 659 // Determines PLAB size for a particular allocation purpose.
sjohanss@7118 660 size_t desired_plab_sz(GCAllocPurpose purpose);
sjohanss@7118 661
jcoomes@7159 662 inline AllocationContextStats& allocation_context_stats();
jcoomes@7159 663
ysr@777 664 // Do anything common to GC's.
ysr@777 665 virtual void gc_prologue(bool full);
ysr@777 666 virtual void gc_epilogue(bool full);
ysr@777 667
tschatzl@7019 668 inline void set_humongous_is_live(oop obj);
tschatzl@7019 669
tschatzl@7019 670 bool humongous_is_live(uint region) {
tschatzl@7019 671 return _humongous_is_live.is_live(region);
tschatzl@7019 672 }
tschatzl@7019 673
tschatzl@7019 674 // Returns whether the given region (which must be a humongous (start) region)
tschatzl@7019 675 // is to be considered conservatively live regardless of any other conditions.
tschatzl@7019 676 bool humongous_region_is_always_live(uint index);
tschatzl@7019 677 // Register the given region to be part of the collection set.
tschatzl@7019 678 inline void register_humongous_region_with_in_cset_fast_test(uint index);
tschatzl@7019 679 // Register regions with humongous objects (actually on the start region) in
tschatzl@7019 680 // the in_cset_fast_test table.
tschatzl@7019 681 void register_humongous_regions_with_in_cset_fast_test();
tonyp@961 682 // We register a region with the fast "in collection set" test. We
tonyp@961 683 // simply set to true the array slot corresponding to this region.
tonyp@961 684 void register_region_with_in_cset_fast_test(HeapRegion* r) {
tschatzl@7091 685 _in_cset_fast_test.set_in_cset(r->hrm_index());
tonyp@961 686 }
tonyp@961 687
tonyp@961 688 // This is a fast test on whether a reference points into the
tschatzl@6330 689 // collection set or not. Assume that the reference
tschatzl@6330 690 // points into the heap.
tschatzl@6541 691 inline bool in_cset_fast_test(oop obj);
tonyp@961 692
johnc@1829 693 void clear_cset_fast_test() {
tschatzl@6926 694 _in_cset_fast_test.clear();
johnc@1829 695 }
johnc@1829 696
brutisso@3823 697 // This is called at the start of either a concurrent cycle or a Full
brutisso@3823 698 // GC to update the number of old marking cycles started.
brutisso@3823 699 void increment_old_marking_cycles_started();
brutisso@3823 700
tonyp@2011 701 // This is called at the end of either a concurrent cycle or a Full
brutisso@3823 702 // GC to update the number of old marking cycles completed. Those two
tonyp@2011 703 // can happen in a nested fashion, i.e., we start a concurrent
tonyp@2011 704 // cycle, a Full GC happens half-way through it which ends first,
tonyp@2011 705 // and then the cycle notices that a Full GC happened and ends
tonyp@2372 706 // too. The concurrent parameter is a boolean to help us do a bit
tonyp@2372 707 // tighter consistency checking in the method. If concurrent is
tonyp@2372 708 // false, the caller is the inner caller in the nesting (i.e., the
tonyp@2372 709 // Full GC). If concurrent is true, the caller is the outer caller
tonyp@2372 710 // in this nesting (i.e., the concurrent cycle). Further nesting is
brutisso@3823 711 // not currently supported. The end of this call also notifies
tonyp@2372 712 // the FullGCCount_lock in case a Java thread is waiting for a full
tonyp@2372 713 // GC to happen (e.g., it called System.gc() with
tonyp@2011 714 // +ExplicitGCInvokesConcurrent).
brutisso@3823 715 void increment_old_marking_cycles_completed(bool concurrent);
tonyp@2011 716
brutisso@3823 717 unsigned int old_marking_cycles_completed() {
brutisso@3823 718 return _old_marking_cycles_completed;
tonyp@2011 719 }
tonyp@2011 720
mgronlun@6131 721 void register_concurrent_cycle_start(const Ticks& start_time);
sla@5237 722 void register_concurrent_cycle_end();
sla@5237 723 void trace_heap_after_concurrent_cycle();
sla@5237 724
sla@5237 725 G1YCType yc_type();
sla@5237 726
tonyp@2975 727 G1HRPrinter* hr_printer() { return &_hr_printer; }
tonyp@2975 728
brutisso@6385 729 // Frees a non-humongous region by initializing its contents and
brutisso@6385 730 // adding it to the free list that's passed as a parameter (this is
brutisso@6385 731 // usually a local list which will be appended to the master free
brutisso@6385 732 // list later). The used bytes of freed regions are accumulated in
brutisso@6385 733 // pre_used. If par is true, the region's RSet will not be freed
brutisso@6385 734 // up. The assumption is that this will be done later.
tschatzl@6404 735 // The locked parameter indicates if the caller has already taken
tschatzl@6404 736 // care of proper synchronization. This may allow some optimizations.
brutisso@6385 737 void free_region(HeapRegion* hr,
brutisso@6385 738 FreeRegionList* free_list,
tschatzl@6404 739 bool par,
tschatzl@6404 740 bool locked = false);
brutisso@6385 741
brutisso@6385 742 // Frees a humongous region by collapsing it into individual regions
brutisso@6385 743 // and calling free_region() for each of them. The freed regions
brutisso@6385 744 // will be added to the free list that's passed as a parameter (this
brutisso@6385 745 // is usually a local list which will be appended to the master free
brutisso@6385 746 // list later). The used bytes of freed regions are accumulated in
brutisso@6385 747 // pre_used. If par is true, the region's RSet will not be freed
brutisso@6385 748 // up. The assumption is that this will be done later.
brutisso@6385 749 void free_humongous_region(HeapRegion* hr,
brutisso@6385 750 FreeRegionList* free_list,
brutisso@6385 751 bool par);
ysr@777 752 protected:
ysr@777 753
ysr@777 754 // Shrink the garbage-first heap by at most the given size (in bytes!).
ysr@777 755 // (Rounds down to a HeapRegion boundary.)
ysr@777 756 virtual void shrink(size_t expand_bytes);
ysr@777 757 void shrink_helper(size_t expand_bytes);
ysr@777 758
jcoomes@2064 759 #if TASKQUEUE_STATS
jcoomes@2064 760 static void print_taskqueue_stats_hdr(outputStream* const st = gclog_or_tty);
jcoomes@2064 761 void print_taskqueue_stats(outputStream* const st = gclog_or_tty) const;
jcoomes@2064 762 void reset_taskqueue_stats();
jcoomes@2064 763 #endif // TASKQUEUE_STATS
jcoomes@2064 764
tonyp@2315 765 // Schedule the VM operation that will do an evacuation pause to
tonyp@2315 766 // satisfy an allocation request of word_size. *succeeded will
tonyp@2315 767 // return whether the VM operation was successful (it did do an
tonyp@2315 768 // evacuation pause) or not (another thread beat us to it or the GC
tonyp@2315 769 // locker was active). Given that we should not be holding the
tonyp@2315 770 // Heap_lock when we enter this method, we will pass the
tonyp@2315 771 // gc_count_before (i.e., total_collections()) as a parameter since
tonyp@2315 772 // it has to be read while holding the Heap_lock. Currently, both
tonyp@2315 773 // methods that call do_collection_pause() release the Heap_lock
tonyp@2315 774 // before the call, so it's easy to read gc_count_before just before.
brutisso@5581 775 HeapWord* do_collection_pause(size_t word_size,
brutisso@5581 776 unsigned int gc_count_before,
brutisso@5581 777 bool* succeeded,
brutisso@5581 778 GCCause::Cause gc_cause);
ysr@777 779
ysr@777 780 // The guts of the incremental collection pause, executed by the vm
tonyp@2315 781 // thread. It returns false if it is unable to do the collection due
tonyp@2315 782 // to the GC locker being active, true otherwise
tonyp@2315 783 bool do_collection_pause_at_safepoint(double target_pause_time_ms);
ysr@777 784
ysr@777 785 // Actually do the work of evacuating the collection set.
sla@5237 786 void evacuate_collection_set(EvacuationInfo& evacuation_info);
ysr@777 787
ysr@777 788 // The g1 remembered set of the heap.
ysr@777 789 G1RemSet* _g1_rem_set;
ysr@777 790
iveresov@1051 791 // A set of cards that cover the objects for which the Rsets should be updated
iveresov@1051 792 // concurrently after the collection.
iveresov@1051 793 DirtyCardQueueSet _dirty_card_queue_set;
iveresov@1051 794
ysr@777 795 // The closure used to refine a single card.
ysr@777 796 RefineCardTableEntryClosure* _refine_cte_cl;
ysr@777 797
ysr@777 798 // A function to check the consistency of dirty card logs.
ysr@777 799 void check_ct_logs_at_safepoint();
ysr@777 800
johnc@2060 801 // A DirtyCardQueueSet that is used to hold cards that contain
johnc@2060 802 // references into the current collection set. This is used to
johnc@2060 803 // update the remembered sets of the regions in the collection
johnc@2060 804 // set in the event of an evacuation failure.
johnc@2060 805 DirtyCardQueueSet _into_cset_dirty_card_queue_set;
johnc@2060 806
ysr@777 807 // After a collection pause, make the regions in the CS into free
ysr@777 808 // regions.
sla@5237 809 void free_collection_set(HeapRegion* cs_head, EvacuationInfo& evacuation_info);
ysr@777 810
johnc@1829 811 // Abandon the current collection set without recording policy
johnc@1829 812 // statistics or updating free lists.
johnc@1829 813 void abandon_collection_set(HeapRegion* cs_head);
johnc@1829 814
ysr@777 815 // Applies "scan_non_heap_roots" to roots outside the heap,
ysr@777 816 // "scan_rs" to roots inside the heap (having done "set_region" to
coleenp@4037 817 // indicate the region in which the root resides),
coleenp@4037 818 // and does "scan_metadata" If "scan_rs" is
ysr@777 819 // NULL, then this step is skipped. The "worker_i"
ysr@777 820 // param is for use with parallel roots processing, and should be
ysr@777 821 // the "i" of the calling parallel worker thread's work(i) function.
ysr@777 822 // In the sequential case this param will be ignored.
stefank@6992 823 void g1_process_roots(OopClosure* scan_non_heap_roots,
stefank@6992 824 OopClosure* scan_non_heap_weak_roots,
stefank@6992 825 OopsInHeapRegionClosure* scan_rs,
stefank@6992 826 CLDClosure* scan_strong_clds,
stefank@6992 827 CLDClosure* scan_weak_clds,
stefank@6992 828 CodeBlobClosure* scan_strong_code,
stefank@6992 829 uint worker_i);
ysr@777 830
ysr@777 831 // The concurrent marker (and the thread it runs in.)
ysr@777 832 ConcurrentMark* _cm;
ysr@777 833 ConcurrentMarkThread* _cmThread;
ysr@777 834 bool _mark_in_progress;
ysr@777 835
ysr@777 836 // The concurrent refiner.
ysr@777 837 ConcurrentG1Refine* _cg1r;
ysr@777 838
ysr@777 839 // The parallel task queues
ysr@777 840 RefToScanQueueSet *_task_queues;
ysr@777 841
ysr@777 842 // True iff a evacuation has failed in the current collection.
ysr@777 843 bool _evacuation_failed;
ysr@777 844
sla@5237 845 EvacuationFailedInfo* _evacuation_failed_info_array;
ysr@777 846
ysr@777 847 // Failed evacuations cause some logical from-space objects to have
ysr@777 848 // forwarding pointers to themselves. Reset them.
ysr@777 849 void remove_self_forwarding_pointers();
ysr@777 850
brutisso@4579 851 // Together, these store an object with a preserved mark, and its mark value.
brutisso@4579 852 Stack<oop, mtGC> _objs_with_preserved_marks;
brutisso@4579 853 Stack<markOop, mtGC> _preserved_marks_of_objs;
ysr@777 854
ysr@777 855 // Preserve the mark of "obj", if necessary, in preparation for its mark
ysr@777 856 // word being overwritten with a self-forwarding-pointer.
ysr@777 857 void preserve_mark_if_necessary(oop obj, markOop m);
ysr@777 858
ysr@777 859 // The stack of evac-failure objects left to be scanned.
ysr@777 860 GrowableArray<oop>* _evac_failure_scan_stack;
ysr@777 861 // The closure to apply to evac-failure objects.
ysr@777 862
ysr@777 863 OopsInHeapRegionClosure* _evac_failure_closure;
ysr@777 864 // Set the field above.
ysr@777 865 void
ysr@777 866 set_evac_failure_closure(OopsInHeapRegionClosure* evac_failure_closure) {
ysr@777 867 _evac_failure_closure = evac_failure_closure;
ysr@777 868 }
ysr@777 869
ysr@777 870 // Push "obj" on the scan stack.
ysr@777 871 void push_on_evac_failure_scan_stack(oop obj);
ysr@777 872 // Process scan stack entries until the stack is empty.
ysr@777 873 void drain_evac_failure_scan_stack();
ysr@777 874 // True iff an invocation of "drain_scan_stack" is in progress; to
ysr@777 875 // prevent unnecessary recursion.
ysr@777 876 bool _drain_in_progress;
ysr@777 877
ysr@777 878 // Do any necessary initialization for evacuation-failure handling.
ysr@777 879 // "cl" is the closure that will be used to process evac-failure
ysr@777 880 // objects.
ysr@777 881 void init_for_evac_failure(OopsInHeapRegionClosure* cl);
ysr@777 882 // Do any necessary cleanup for evacuation-failure handling data
ysr@777 883 // structures.
ysr@777 884 void finalize_for_evac_failure();
ysr@777 885
ysr@777 886 // An attempt to evacuate "obj" has failed; take necessary steps.
sla@5237 887 oop handle_evacuation_failure_par(G1ParScanThreadState* _par_scan_state, oop obj);
ysr@777 888 void handle_evacuation_failure_common(oop obj, markOop m);
ysr@777 889
johnc@4016 890 #ifndef PRODUCT
johnc@4016 891 // Support for forcing evacuation failures. Analogous to
johnc@4016 892 // PromotionFailureALot for the other collectors.
johnc@4016 893
johnc@4016 894 // Records whether G1EvacuationFailureALot should be in effect
johnc@4016 895 // for the current GC
johnc@4016 896 bool _evacuation_failure_alot_for_current_gc;
johnc@4016 897
johnc@4016 898 // Used to record the GC number for interval checking when
johnc@4016 899 // determining whether G1EvaucationFailureALot is in effect
johnc@4016 900 // for the current GC.
johnc@4016 901 size_t _evacuation_failure_alot_gc_number;
johnc@4016 902
johnc@4016 903 // Count of the number of evacuations between failures.
johnc@4016 904 volatile size_t _evacuation_failure_alot_count;
johnc@4016 905
johnc@4016 906 // Set whether G1EvacuationFailureALot should be in effect
johnc@4016 907 // for the current GC (based upon the type of GC and which
johnc@4016 908 // command line flags are set);
johnc@4016 909 inline bool evacuation_failure_alot_for_gc_type(bool gcs_are_young,
johnc@4016 910 bool during_initial_mark,
johnc@4016 911 bool during_marking);
johnc@4016 912
johnc@4016 913 inline void set_evacuation_failure_alot_for_current_gc();
johnc@4016 914
johnc@4016 915 // Return true if it's time to cause an evacuation failure.
johnc@4016 916 inline bool evacuation_should_fail();
johnc@4016 917
johnc@4016 918 // Reset the G1EvacuationFailureALot counters. Should be called at
sla@5237 919 // the end of an evacuation pause in which an evacuation failure occurred.
johnc@4016 920 inline void reset_evacuation_should_fail();
johnc@4016 921 #endif // !PRODUCT
johnc@4016 922
johnc@3175 923 // ("Weak") Reference processing support.
johnc@3175 924 //
sla@5237 925 // G1 has 2 instances of the reference processor class. One
johnc@3175 926 // (_ref_processor_cm) handles reference object discovery
johnc@3175 927 // and subsequent processing during concurrent marking cycles.
johnc@3175 928 //
johnc@3175 929 // The other (_ref_processor_stw) handles reference object
johnc@3175 930 // discovery and processing during full GCs and incremental
johnc@3175 931 // evacuation pauses.
johnc@3175 932 //
johnc@3175 933 // During an incremental pause, reference discovery will be
johnc@3175 934 // temporarily disabled for _ref_processor_cm and will be
johnc@3175 935 // enabled for _ref_processor_stw. At the end of the evacuation
johnc@3175 936 // pause references discovered by _ref_processor_stw will be
johnc@3175 937 // processed and discovery will be disabled. The previous
johnc@3175 938 // setting for reference object discovery for _ref_processor_cm
johnc@3175 939 // will be re-instated.
johnc@3175 940 //
johnc@3175 941 // At the start of marking:
johnc@3175 942 // * Discovery by the CM ref processor is verified to be inactive
johnc@3175 943 // and it's discovered lists are empty.
johnc@3175 944 // * Discovery by the CM ref processor is then enabled.
johnc@3175 945 //
johnc@3175 946 // At the end of marking:
johnc@3175 947 // * Any references on the CM ref processor's discovered
johnc@3175 948 // lists are processed (possibly MT).
johnc@3175 949 //
johnc@3175 950 // At the start of full GC we:
johnc@3175 951 // * Disable discovery by the CM ref processor and
johnc@3175 952 // empty CM ref processor's discovered lists
johnc@3175 953 // (without processing any entries).
johnc@3175 954 // * Verify that the STW ref processor is inactive and it's
johnc@3175 955 // discovered lists are empty.
johnc@3175 956 // * Temporarily set STW ref processor discovery as single threaded.
johnc@3175 957 // * Temporarily clear the STW ref processor's _is_alive_non_header
johnc@3175 958 // field.
johnc@3175 959 // * Finally enable discovery by the STW ref processor.
johnc@3175 960 //
johnc@3175 961 // The STW ref processor is used to record any discovered
johnc@3175 962 // references during the full GC.
johnc@3175 963 //
johnc@3175 964 // At the end of a full GC we:
johnc@3175 965 // * Enqueue any reference objects discovered by the STW ref processor
johnc@3175 966 // that have non-live referents. This has the side-effect of
johnc@3175 967 // making the STW ref processor inactive by disabling discovery.
johnc@3175 968 // * Verify that the CM ref processor is still inactive
johnc@3175 969 // and no references have been placed on it's discovered
johnc@3175 970 // lists (also checked as a precondition during initial marking).
johnc@3175 971
johnc@3175 972 // The (stw) reference processor...
johnc@3175 973 ReferenceProcessor* _ref_processor_stw;
johnc@3175 974
sla@5237 975 STWGCTimer* _gc_timer_stw;
sla@5237 976 ConcurrentGCTimer* _gc_timer_cm;
sla@5237 977
sla@5237 978 G1OldTracer* _gc_tracer_cm;
sla@5237 979 G1NewTracer* _gc_tracer_stw;
sla@5237 980
johnc@3175 981 // During reference object discovery, the _is_alive_non_header
johnc@3175 982 // closure (if non-null) is applied to the referent object to
johnc@3175 983 // determine whether the referent is live. If so then the
johnc@3175 984 // reference object does not need to be 'discovered' and can
johnc@3175 985 // be treated as a regular oop. This has the benefit of reducing
johnc@3175 986 // the number of 'discovered' reference objects that need to
johnc@3175 987 // be processed.
johnc@3175 988 //
johnc@3175 989 // Instance of the is_alive closure for embedding into the
johnc@3175 990 // STW reference processor as the _is_alive_non_header field.
johnc@3175 991 // Supplying a value for the _is_alive_non_header field is
johnc@3175 992 // optional but doing so prevents unnecessary additions to
johnc@3175 993 // the discovered lists during reference discovery.
johnc@3175 994 G1STWIsAliveClosure _is_alive_closure_stw;
johnc@3175 995
johnc@3175 996 // The (concurrent marking) reference processor...
johnc@3175 997 ReferenceProcessor* _ref_processor_cm;
johnc@3175 998
johnc@2379 999 // Instance of the concurrent mark is_alive closure for embedding
johnc@3175 1000 // into the Concurrent Marking reference processor as the
johnc@3175 1001 // _is_alive_non_header field. Supplying a value for the
johnc@3175 1002 // _is_alive_non_header field is optional but doing so prevents
johnc@3175 1003 // unnecessary additions to the discovered lists during reference
johnc@3175 1004 // discovery.
johnc@3175 1005 G1CMIsAliveClosure _is_alive_closure_cm;
ysr@777 1006
johnc@3336 1007 // Cache used by G1CollectedHeap::start_cset_region_for_worker().
johnc@3336 1008 HeapRegion** _worker_cset_start_region;
johnc@3336 1009
johnc@3336 1010 // Time stamp to validate the regions recorded in the cache
johnc@3336 1011 // used by G1CollectedHeap::start_cset_region_for_worker().
johnc@3336 1012 // The heap region entry for a given worker is valid iff
johnc@3336 1013 // the associated time stamp value matches the current value
johnc@3336 1014 // of G1CollectedHeap::_gc_time_stamp.
johnc@3336 1015 unsigned int* _worker_cset_start_region_time_stamp;
johnc@3336 1016
stefank@6992 1017 enum G1H_process_roots_tasks {
tonyp@3416 1018 G1H_PS_filter_satb_buffers,
ysr@777 1019 G1H_PS_refProcessor_oops_do,
ysr@777 1020 // Leave this one last.
ysr@777 1021 G1H_PS_NumElements
ysr@777 1022 };
ysr@777 1023
ysr@777 1024 SubTasksDone* _process_strong_tasks;
ysr@777 1025
tonyp@2472 1026 volatile bool _free_regions_coming;
ysr@777 1027
ysr@777 1028 public:
jmasa@2188 1029
jmasa@2188 1030 SubTasksDone* process_strong_tasks() { return _process_strong_tasks; }
jmasa@2188 1031
ysr@777 1032 void set_refine_cte_cl_concurrency(bool concurrent);
ysr@777 1033
jcoomes@2064 1034 RefToScanQueue *task_queue(int i) const;
ysr@777 1035
iveresov@1051 1036 // A set of cards where updates happened during the GC
iveresov@1051 1037 DirtyCardQueueSet& dirty_card_queue_set() { return _dirty_card_queue_set; }
iveresov@1051 1038
johnc@2060 1039 // A DirtyCardQueueSet that is used to hold cards that contain
johnc@2060 1040 // references into the current collection set. This is used to
johnc@2060 1041 // update the remembered sets of the regions in the collection
johnc@2060 1042 // set in the event of an evacuation failure.
johnc@2060 1043 DirtyCardQueueSet& into_cset_dirty_card_queue_set()
johnc@2060 1044 { return _into_cset_dirty_card_queue_set; }
johnc@2060 1045
ysr@777 1046 // Create a G1CollectedHeap with the specified policy.
ysr@777 1047 // Must call the initialize method afterwards.
ysr@777 1048 // May not return if something goes wrong.
ysr@777 1049 G1CollectedHeap(G1CollectorPolicy* policy);
ysr@777 1050
ysr@777 1051 // Initialize the G1CollectedHeap to have the initial and
coleenp@4037 1052 // maximum sizes and remembered and barrier sets
ysr@777 1053 // specified by the policy object.
ysr@777 1054 jint initialize();
ysr@777 1055
pliden@6690 1056 virtual void stop();
pliden@6690 1057
tschatzl@5701 1058 // Return the (conservative) maximum heap alignment for any G1 heap
tschatzl@5701 1059 static size_t conservative_max_heap_alignment();
tschatzl@5701 1060
johnc@3175 1061 // Initialize weak reference processing.
johnc@2379 1062 virtual void ref_processing_init();
ysr@777 1063
jmasa@3357 1064 void set_par_threads(uint t) {
ysr@777 1065 SharedHeap::set_par_threads(t);
jmasa@3294 1066 // Done in SharedHeap but oddly there are
jmasa@3294 1067 // two _process_strong_tasks's in a G1CollectedHeap
jmasa@3294 1068 // so do it here too.
jmasa@3294 1069 _process_strong_tasks->set_n_threads(t);
jmasa@3294 1070 }
jmasa@3294 1071
jmasa@3294 1072 // Set _n_par_threads according to a policy TBD.
jmasa@3294 1073 void set_par_threads();
jmasa@3294 1074
jmasa@3294 1075 void set_n_termination(int t) {
jmasa@2188 1076 _process_strong_tasks->set_n_threads(t);
ysr@777 1077 }
ysr@777 1078
ysr@777 1079 virtual CollectedHeap::Name kind() const {
ysr@777 1080 return CollectedHeap::G1CollectedHeap;
ysr@777 1081 }
ysr@777 1082
ysr@777 1083 // The current policy object for the collector.
ysr@777 1084 G1CollectorPolicy* g1_policy() const { return _g1_policy; }
ysr@777 1085
coleenp@4037 1086 virtual CollectorPolicy* collector_policy() const { return (CollectorPolicy*) g1_policy(); }
coleenp@4037 1087
ysr@777 1088 // Adaptive size policy. No such thing for g1.
ysr@777 1089 virtual AdaptiveSizePolicy* size_policy() { return NULL; }
ysr@777 1090
ysr@777 1091 // The rem set and barrier set.
ysr@777 1092 G1RemSet* g1_rem_set() const { return _g1_rem_set; }
ysr@777 1093
ysr@777 1094 unsigned get_gc_time_stamp() {
ysr@777 1095 return _gc_time_stamp;
ysr@777 1096 }
ysr@777 1097
goetz@6911 1098 inline void reset_gc_time_stamp();
iveresov@788 1099
tonyp@3957 1100 void check_gc_time_stamps() PRODUCT_RETURN;
tonyp@3957 1101
goetz@6911 1102 inline void increment_gc_time_stamp();
ysr@777 1103
tonyp@3957 1104 // Reset the given region's GC timestamp. If it's starts humongous,
tonyp@3957 1105 // also reset the GC timestamp of its corresponding
tonyp@3957 1106 // continues humongous regions too.
tonyp@3957 1107 void reset_gc_time_stamps(HeapRegion* hr);
tonyp@3957 1108
johnc@2060 1109 void iterate_dirty_card_closure(CardTableEntryClosure* cl,
johnc@2060 1110 DirtyCardQueue* into_cset_dcq,
vkempik@6552 1111 bool concurrent, uint worker_i);
ysr@777 1112
ysr@777 1113 // The shared block offset table array.
ysr@777 1114 G1BlockOffsetSharedArray* bot_shared() const { return _bot_shared; }
ysr@777 1115
johnc@3175 1116 // Reference Processing accessors
johnc@3175 1117
johnc@3175 1118 // The STW reference processor....
johnc@3175 1119 ReferenceProcessor* ref_processor_stw() const { return _ref_processor_stw; }
johnc@3175 1120
sla@5237 1121 // The Concurrent Marking reference processor...
johnc@3175 1122 ReferenceProcessor* ref_processor_cm() const { return _ref_processor_cm; }
ysr@777 1123
sla@5237 1124 ConcurrentGCTimer* gc_timer_cm() const { return _gc_timer_cm; }
sla@5237 1125 G1OldTracer* gc_tracer_cm() const { return _gc_tracer_cm; }
sla@5237 1126
ysr@777 1127 virtual size_t capacity() const;
ysr@777 1128 virtual size_t used() const;
tonyp@1281 1129 // This should be called when we're not holding the heap lock. The
tonyp@1281 1130 // result might be a bit inaccurate.
tonyp@1281 1131 size_t used_unlocked() const;
ysr@777 1132 size_t recalculate_used() const;
ysr@777 1133
ysr@777 1134 // These virtual functions do the actual allocation.
ysr@777 1135 // Some heaps may offer a contiguous region for shared non-blocking
ysr@777 1136 // allocation, via inlined code (by exporting the address of the top and
ysr@777 1137 // end fields defining the extent of the contiguous allocation region.)
ysr@777 1138 // But G1CollectedHeap doesn't yet support this.
ysr@777 1139
ysr@777 1140 virtual bool is_maximal_no_gc() const {
tschatzl@7091 1141 return _hrm.available() == 0;
ysr@777 1142 }
ysr@777 1143
tschatzl@7050 1144 // The current number of regions in the heap.
tschatzl@7091 1145 uint num_regions() const { return _hrm.length(); }
tonyp@2963 1146
tonyp@2963 1147 // The max number of regions in the heap.
tschatzl@7091 1148 uint max_regions() const { return _hrm.max_length(); }
ysr@777 1149
ysr@777 1150 // The number of regions that are completely free.
tschatzl@7091 1151 uint num_free_regions() const { return _hrm.num_free_regions(); }
ysr@777 1152
ysr@777 1153 // The number of regions that are not completely free.
tschatzl@7050 1154 uint num_used_regions() const { return num_regions() - num_free_regions(); }
tonyp@2963 1155
tonyp@2849 1156 void verify_not_dirty_region(HeapRegion* hr) PRODUCT_RETURN;
tonyp@2849 1157 void verify_dirty_region(HeapRegion* hr) PRODUCT_RETURN;
tonyp@2715 1158 void verify_dirty_young_list(HeapRegion* head) PRODUCT_RETURN;
tonyp@2715 1159 void verify_dirty_young_regions() PRODUCT_RETURN;
tonyp@2715 1160
brutisso@7005 1161 #ifndef PRODUCT
brutisso@7005 1162 // Make sure that the given bitmap has no marked objects in the
brutisso@7005 1163 // range [from,limit). If it does, print an error message and return
brutisso@7005 1164 // false. Otherwise, just return true. bitmap_name should be "prev"
brutisso@7005 1165 // or "next".
brutisso@7005 1166 bool verify_no_bits_over_tams(const char* bitmap_name, CMBitMapRO* bitmap,
brutisso@7005 1167 HeapWord* from, HeapWord* limit);
brutisso@7005 1168
brutisso@7005 1169 // Verify that the prev / next bitmap range [tams,end) for the given
brutisso@7005 1170 // region has no marks. Return true if all is well, false if errors
brutisso@7005 1171 // are detected.
brutisso@7005 1172 bool verify_bitmaps(const char* caller, HeapRegion* hr);
brutisso@7005 1173 #endif // PRODUCT
brutisso@7005 1174
brutisso@7005 1175 // If G1VerifyBitmaps is set, verify that the marking bitmaps for
brutisso@7005 1176 // the given region do not have any spurious marks. If errors are
brutisso@7005 1177 // detected, print appropriate error messages and crash.
brutisso@7005 1178 void check_bitmaps(const char* caller, HeapRegion* hr) PRODUCT_RETURN;
brutisso@7005 1179
brutisso@7005 1180 // If G1VerifyBitmaps is set, verify that the marking bitmaps do not
brutisso@7005 1181 // have any spurious marks. If errors are detected, print
brutisso@7005 1182 // appropriate error messages and crash.
brutisso@7005 1183 void check_bitmaps(const char* caller) PRODUCT_RETURN;
brutisso@7005 1184
tonyp@2472 1185 // verify_region_sets() performs verification over the region
tonyp@2472 1186 // lists. It will be compiled in the product code to be used when
tonyp@2472 1187 // necessary (i.e., during heap verification).
tonyp@2472 1188 void verify_region_sets();
ysr@777 1189
tonyp@2472 1190 // verify_region_sets_optional() is planted in the code for
tonyp@2472 1191 // list verification in non-product builds (and it can be enabled in
sla@5237 1192 // product builds by defining HEAP_REGION_SET_FORCE_VERIFY to be 1).
tonyp@2472 1193 #if HEAP_REGION_SET_FORCE_VERIFY
tonyp@2472 1194 void verify_region_sets_optional() {
tonyp@2472 1195 verify_region_sets();
tonyp@2472 1196 }
tonyp@2472 1197 #else // HEAP_REGION_SET_FORCE_VERIFY
tonyp@2472 1198 void verify_region_sets_optional() { }
tonyp@2472 1199 #endif // HEAP_REGION_SET_FORCE_VERIFY
ysr@777 1200
tonyp@2472 1201 #ifdef ASSERT
tonyp@2643 1202 bool is_on_master_free_list(HeapRegion* hr) {
tschatzl@7091 1203 return _hrm.is_free(hr);
tonyp@2472 1204 }
tonyp@2472 1205 #endif // ASSERT
ysr@777 1206
tonyp@2472 1207 // Wrapper for the region list operations that can be called from
tonyp@2472 1208 // methods outside this class.
ysr@777 1209
jwilhelm@6422 1210 void secondary_free_list_add(FreeRegionList* list) {
jwilhelm@6422 1211 _secondary_free_list.add_ordered(list);
tonyp@2472 1212 }
ysr@777 1213
tonyp@2472 1214 void append_secondary_free_list() {
tschatzl@7091 1215 _hrm.insert_list_into_free_list(&_secondary_free_list);
tonyp@2472 1216 }
ysr@777 1217
tonyp@2643 1218 void append_secondary_free_list_if_not_empty_with_lock() {
tonyp@2643 1219 // If the secondary free list looks empty there's no reason to
tonyp@2643 1220 // take the lock and then try to append it.
tonyp@2472 1221 if (!_secondary_free_list.is_empty()) {
tonyp@2472 1222 MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag);
tonyp@2472 1223 append_secondary_free_list();
tonyp@2472 1224 }
tonyp@2472 1225 }
ysr@777 1226
tschatzl@6541 1227 inline void old_set_remove(HeapRegion* hr);
tonyp@3268 1228
brutisso@3456 1229 size_t non_young_capacity_bytes() {
brutisso@3456 1230 return _old_set.total_capacity_bytes() + _humongous_set.total_capacity_bytes();
brutisso@3456 1231 }
brutisso@3456 1232
tonyp@2472 1233 void set_free_regions_coming();
tonyp@2472 1234 void reset_free_regions_coming();
tonyp@2472 1235 bool free_regions_coming() { return _free_regions_coming; }
tonyp@2472 1236 void wait_while_free_regions_coming();
ysr@777 1237
tonyp@3539 1238 // Determine whether the given region is one that we are using as an
tonyp@3539 1239 // old GC alloc region.
tonyp@3539 1240 bool is_old_gc_alloc_region(HeapRegion* hr) {
sjohanss@7118 1241 return _allocator->is_retained_old_region(hr);
tonyp@3539 1242 }
tonyp@3539 1243
ysr@777 1244 // Perform a collection of the heap; intended for use in implementing
ysr@777 1245 // "System.gc". This probably implies as full a collection as the
ysr@777 1246 // "CollectedHeap" supports.
ysr@777 1247 virtual void collect(GCCause::Cause cause);
ysr@777 1248
ysr@777 1249 // The same as above but assume that the caller holds the Heap_lock.
ysr@777 1250 void collect_locked(GCCause::Cause cause);
ysr@777 1251
jcoomes@7160 1252 virtual void copy_allocation_context_stats(const jint* contexts,
jcoomes@7160 1253 jlong* totals,
jcoomes@7160 1254 jbyte* accuracy,
jcoomes@7160 1255 jint len);
jcoomes@7160 1256
sla@5237 1257 // True iff an evacuation has failed in the most-recent collection.
ysr@777 1258 bool evacuation_failed() { return _evacuation_failed; }
ysr@777 1259
brutisso@6385 1260 void remove_from_old_sets(const HeapRegionSetCount& old_regions_removed, const HeapRegionSetCount& humongous_regions_removed);
brutisso@6385 1261 void prepend_to_freelist(FreeRegionList* list);
brutisso@6385 1262 void decrement_summary_bytes(size_t bytes);
ysr@777 1263
stefank@3335 1264 // Returns "TRUE" iff "p" points into the committed areas of the heap.
ysr@777 1265 virtual bool is_in(const void* p) const;
tschatzl@7051 1266 #ifdef ASSERT
tschatzl@7051 1267 // Returns whether p is in one of the available areas of the heap. Slow but
tschatzl@7051 1268 // extensive version.
tschatzl@7051 1269 bool is_in_exact(const void* p) const;
tschatzl@7051 1270 #endif
ysr@777 1271
ysr@777 1272 // Return "TRUE" iff the given object address is within the collection
tschatzl@7019 1273 // set. Slow implementation.
ysr@777 1274 inline bool obj_in_cs(oop obj);
ysr@777 1275
tschatzl@7019 1276 inline bool is_in_cset(oop obj);
tschatzl@7019 1277
tschatzl@7019 1278 inline bool is_in_cset_or_humongous(const oop obj);
tschatzl@7019 1279
tschatzl@7019 1280 enum in_cset_state_t {
tschatzl@7019 1281 InNeither, // neither in collection set nor humongous
tschatzl@7019 1282 InCSet, // region is in collection set only
tschatzl@7019 1283 IsHumongous // region is a humongous start region
tschatzl@7019 1284 };
tschatzl@7019 1285 private:
tschatzl@7019 1286 // Instances of this class are used for quick tests on whether a reference points
tschatzl@7019 1287 // into the collection set or is a humongous object (points into a humongous
tschatzl@7019 1288 // object).
tschatzl@7019 1289 // Each of the array's elements denotes whether the corresponding region is in
tschatzl@7019 1290 // the collection set or a humongous region.
tschatzl@7019 1291 // We use this to quickly reclaim humongous objects: by making a humongous region
tschatzl@7019 1292 // succeed this test, we sort-of add it to the collection set. During the reference
tschatzl@7019 1293 // iteration closures, when we see a humongous region, we simply mark it as
tschatzl@7019 1294 // referenced, i.e. live.
tschatzl@7019 1295 class G1FastCSetBiasedMappedArray : public G1BiasedMappedArray<char> {
tschatzl@7019 1296 protected:
tschatzl@7019 1297 char default_value() const { return G1CollectedHeap::InNeither; }
tschatzl@7019 1298 public:
tschatzl@7019 1299 void set_humongous(uintptr_t index) {
tschatzl@7019 1300 assert(get_by_index(index) != InCSet, "Should not overwrite InCSet values");
tschatzl@7019 1301 set_by_index(index, G1CollectedHeap::IsHumongous);
tschatzl@7019 1302 }
tschatzl@7019 1303
tschatzl@7019 1304 void clear_humongous(uintptr_t index) {
tschatzl@7019 1305 set_by_index(index, G1CollectedHeap::InNeither);
tschatzl@7019 1306 }
tschatzl@7019 1307
tschatzl@7019 1308 void set_in_cset(uintptr_t index) {
tschatzl@7019 1309 assert(get_by_index(index) != G1CollectedHeap::IsHumongous, "Should not overwrite IsHumongous value");
tschatzl@7019 1310 set_by_index(index, G1CollectedHeap::InCSet);
tschatzl@7019 1311 }
tschatzl@7019 1312
tschatzl@7019 1313 bool is_in_cset_or_humongous(HeapWord* addr) const { return get_by_address(addr) != G1CollectedHeap::InNeither; }
tschatzl@7019 1314 bool is_in_cset(HeapWord* addr) const { return get_by_address(addr) == G1CollectedHeap::InCSet; }
tschatzl@7019 1315 G1CollectedHeap::in_cset_state_t at(HeapWord* addr) const { return (G1CollectedHeap::in_cset_state_t)get_by_address(addr); }
tschatzl@7019 1316 void clear() { G1BiasedMappedArray<char>::clear(); }
tschatzl@7019 1317 };
tschatzl@7019 1318
tschatzl@7019 1319 // This array is used for a quick test on whether a reference points into
tschatzl@7019 1320 // the collection set or not. Each of the array's elements denotes whether the
tschatzl@7019 1321 // corresponding region is in the collection set or not.
tschatzl@7019 1322 G1FastCSetBiasedMappedArray _in_cset_fast_test;
tschatzl@7019 1323
tschatzl@7019 1324 public:
tschatzl@7019 1325
tschatzl@7019 1326 inline in_cset_state_t in_cset_state(const oop obj);
tschatzl@7019 1327
ysr@777 1328 // Return "TRUE" iff the given object address is in the reserved
coleenp@4037 1329 // region of g1.
ysr@777 1330 bool is_in_g1_reserved(const void* p) const {
tschatzl@7091 1331 return _hrm.reserved().contains(p);
ysr@777 1332 }
ysr@777 1333
tonyp@2717 1334 // Returns a MemRegion that corresponds to the space that has been
tonyp@2717 1335 // reserved for the heap
tschatzl@7050 1336 MemRegion g1_reserved() const {
tschatzl@7091 1337 return _hrm.reserved();
tonyp@2717 1338 }
tonyp@2717 1339
johnc@2593 1340 virtual bool is_in_closed_subset(const void* p) const;
ysr@777 1341
tschatzl@7051 1342 G1SATBCardTableLoggingModRefBS* g1_barrier_set() {
tschatzl@7051 1343 return (G1SATBCardTableLoggingModRefBS*) barrier_set();
mgerdin@5811 1344 }
mgerdin@5811 1345
ysr@777 1346 // This resets the card table to all zeros. It is used after
ysr@777 1347 // a collection pause which used the card table to claim cards.
ysr@777 1348 void cleanUpCardTable();
ysr@777 1349
ysr@777 1350 // Iteration functions.
ysr@777 1351
ysr@777 1352 // Iterate over all the ref-containing fields of all objects, calling
ysr@777 1353 // "cl.do_oop" on each.
coleenp@4037 1354 virtual void oop_iterate(ExtendedOopClosure* cl);
ysr@777 1355
ysr@777 1356 // Iterate over all objects, calling "cl.do_object" on each.
coleenp@4037 1357 virtual void object_iterate(ObjectClosure* cl);
coleenp@4037 1358
coleenp@4037 1359 virtual void safe_object_iterate(ObjectClosure* cl) {
coleenp@4037 1360 object_iterate(cl);
iveresov@1113 1361 }
ysr@777 1362
ysr@777 1363 // Iterate over all spaces in use in the heap, in ascending address order.
ysr@777 1364 virtual void space_iterate(SpaceClosure* cl);
ysr@777 1365
ysr@777 1366 // Iterate over heap regions, in address order, terminating the
ysr@777 1367 // iteration early if the "doHeapRegion" method returns "true".
tonyp@2963 1368 void heap_region_iterate(HeapRegionClosure* blk) const;
ysr@777 1369
tonyp@2963 1370 // Return the region with the given index. It assumes the index is valid.
tschatzl@6541 1371 inline HeapRegion* region_at(uint index) const;
ysr@777 1372
tschatzl@7019 1373 // Calculate the region index of the given address. Given address must be
tschatzl@7019 1374 // within the heap.
tschatzl@7019 1375 inline uint addr_to_region(HeapWord* addr) const;
tschatzl@7019 1376
tschatzl@7050 1377 inline HeapWord* bottom_addr_for_region(uint index) const;
tschatzl@7050 1378
ysr@777 1379 // Divide the heap region sequence into "chunks" of some size (the number
ysr@777 1380 // of regions divided by the number of parallel threads times some
ysr@777 1381 // overpartition factor, currently 4). Assumes that this will be called
ysr@777 1382 // in parallel by ParallelGCThreads worker threads with discinct worker
ysr@777 1383 // ids in the range [0..max(ParallelGCThreads-1, 1)], that all parallel
ysr@777 1384 // calls will use the same "claim_value", and that that claim value is
ysr@777 1385 // different from the claim_value of any heap region before the start of
ysr@777 1386 // the iteration. Applies "blk->doHeapRegion" to each of the regions, by
ysr@777 1387 // attempting to claim the first region in each chunk, and, if
ysr@777 1388 // successful, applying the closure to each region in the chunk (and
ysr@777 1389 // setting the claim value of the second and subsequent regions of the
ysr@777 1390 // chunk.) For now requires that "doHeapRegion" always returns "false",
ysr@777 1391 // i.e., that a closure never attempt to abort a traversal.
tschatzl@7050 1392 void heap_region_par_iterate_chunked(HeapRegionClosure* cl,
tschatzl@7050 1393 uint worker_id,
tschatzl@7050 1394 uint num_workers,
tschatzl@7050 1395 jint claim_value) const;
ysr@777 1396
tonyp@825 1397 // It resets all the region claim values to the default.
tonyp@825 1398 void reset_heap_region_claim_values();
tonyp@825 1399
johnc@3412 1400 // Resets the claim values of regions in the current
johnc@3412 1401 // collection set to the default.
johnc@3412 1402 void reset_cset_heap_region_claim_values();
johnc@3412 1403
tonyp@790 1404 #ifdef ASSERT
tonyp@790 1405 bool check_heap_region_claim_values(jint claim_value);
johnc@3296 1406
johnc@3296 1407 // Same as the routine above but only checks regions in the
johnc@3296 1408 // current collection set.
johnc@3296 1409 bool check_cset_heap_region_claim_values(jint claim_value);
tonyp@790 1410 #endif // ASSERT
tonyp@790 1411
johnc@3336 1412 // Clear the cached cset start regions and (more importantly)
johnc@3336 1413 // the time stamps. Called when we reset the GC time stamp.
johnc@3336 1414 void clear_cset_start_regions();
johnc@3336 1415
johnc@3336 1416 // Given the id of a worker, obtain or calculate a suitable
johnc@3336 1417 // starting region for iterating over the current collection set.
vkempik@6552 1418 HeapRegion* start_cset_region_for_worker(uint worker_i);
johnc@3296 1419
ysr@777 1420 // Iterate over the regions (if any) in the current collection set.
ysr@777 1421 void collection_set_iterate(HeapRegionClosure* blk);
ysr@777 1422
ysr@777 1423 // As above but starting from region r
ysr@777 1424 void collection_set_iterate_from(HeapRegion* r, HeapRegionClosure *blk);
ysr@777 1425
tschatzl@7018 1426 HeapRegion* next_compaction_region(const HeapRegion* from) const;
ysr@777 1427
ysr@777 1428 // A CollectedHeap will contain some number of spaces. This finds the
ysr@777 1429 // space containing a given address, or else returns NULL.
ysr@777 1430 virtual Space* space_containing(const void* addr) const;
ysr@777 1431
brutisso@7049 1432 // Returns the HeapRegion that contains addr. addr must not be NULL.
brutisso@7049 1433 template <class T>
brutisso@7049 1434 inline HeapRegion* heap_region_containing_raw(const T addr) const;
brutisso@7049 1435
brutisso@7049 1436 // Returns the HeapRegion that contains addr. addr must not be NULL.
brutisso@7049 1437 // If addr is within a humongous continues region, it returns its humongous start region.
tonyp@2963 1438 template <class T>
tonyp@2963 1439 inline HeapRegion* heap_region_containing(const T addr) const;
ysr@777 1440
ysr@777 1441 // A CollectedHeap is divided into a dense sequence of "blocks"; that is,
ysr@777 1442 // each address in the (reserved) heap is a member of exactly
ysr@777 1443 // one block. The defining characteristic of a block is that it is
ysr@777 1444 // possible to find its size, and thus to progress forward to the next
ysr@777 1445 // block. (Blocks may be of different sizes.) Thus, blocks may
ysr@777 1446 // represent Java objects, or they might be free blocks in a
ysr@777 1447 // free-list-based heap (or subheap), as long as the two kinds are
ysr@777 1448 // distinguishable and the size of each is determinable.
ysr@777 1449
ysr@777 1450 // Returns the address of the start of the "block" that contains the
ysr@777 1451 // address "addr". We say "blocks" instead of "object" since some heaps
ysr@777 1452 // may not pack objects densely; a chunk may either be an object or a
ysr@777 1453 // non-object.
ysr@777 1454 virtual HeapWord* block_start(const void* addr) const;
ysr@777 1455
ysr@777 1456 // Requires "addr" to be the start of a chunk, and returns its size.
ysr@777 1457 // "addr + size" is required to be the start of a new chunk, or the end
ysr@777 1458 // of the active area of the heap.
ysr@777 1459 virtual size_t block_size(const HeapWord* addr) const;
ysr@777 1460
ysr@777 1461 // Requires "addr" to be the start of a block, and returns "TRUE" iff
ysr@777 1462 // the block is an object.
ysr@777 1463 virtual bool block_is_obj(const HeapWord* addr) const;
ysr@777 1464
ysr@777 1465 // Does this heap support heap inspection? (+PrintClassHistogram)
ysr@777 1466 virtual bool supports_heap_inspection() const { return true; }
ysr@777 1467
ysr@777 1468 // Section on thread-local allocation buffers (TLABs)
ysr@777 1469 // See CollectedHeap for semantics.
ysr@777 1470
brutisso@6376 1471 bool supports_tlab_allocation() const;
brutisso@6376 1472 size_t tlab_capacity(Thread* ignored) const;
brutisso@6376 1473 size_t tlab_used(Thread* ignored) const;
brutisso@6376 1474 size_t max_tlab_size() const;
brutisso@6376 1475 size_t unsafe_max_tlab_alloc(Thread* ignored) const;
ysr@777 1476
ysr@777 1477 // Can a compiler initialize a new object without store barriers?
ysr@777 1478 // This permission only extends from the creation of a new object
ysr@1462 1479 // via a TLAB up to the first subsequent safepoint. If such permission
ysr@1462 1480 // is granted for this heap type, the compiler promises to call
ysr@1462 1481 // defer_store_barrier() below on any slow path allocation of
ysr@1462 1482 // a new object for which such initializing store barriers will
ysr@1462 1483 // have been elided. G1, like CMS, allows this, but should be
ysr@1462 1484 // ready to provide a compensating write barrier as necessary
ysr@1462 1485 // if that storage came out of a non-young region. The efficiency
ysr@1462 1486 // of this implementation depends crucially on being able to
ysr@1462 1487 // answer very efficiently in constant time whether a piece of
ysr@1462 1488 // storage in the heap comes from a young region or not.
ysr@1462 1489 // See ReduceInitialCardMarks.
ysr@777 1490 virtual bool can_elide_tlab_store_barriers() const {
brutisso@3184 1491 return true;
ysr@1462 1492 }
ysr@1462 1493
ysr@1601 1494 virtual bool card_mark_must_follow_store() const {
ysr@1601 1495 return true;
ysr@1601 1496 }
ysr@1601 1497
tschatzl@6541 1498 inline bool is_in_young(const oop obj);
ysr@1462 1499
jmasa@2909 1500 #ifdef ASSERT
jmasa@2909 1501 virtual bool is_in_partial_collection(const void* p);
jmasa@2909 1502 #endif
jmasa@2909 1503
jmasa@2909 1504 virtual bool is_scavengable(const void* addr);
jmasa@2909 1505
ysr@1462 1506 // We don't need barriers for initializing stores to objects
ysr@1462 1507 // in the young gen: for the SATB pre-barrier, there is no
ysr@1462 1508 // pre-value that needs to be remembered; for the remembered-set
ysr@1462 1509 // update logging post-barrier, we don't maintain remembered set
brutisso@3065 1510 // information for young gen objects.
tschatzl@6541 1511 virtual inline bool can_elide_initializing_store_barrier(oop new_obj);
ysr@777 1512
ysr@777 1513 // Returns "true" iff the given word_size is "very large".
ysr@777 1514 static bool isHumongous(size_t word_size) {
johnc@1748 1515 // Note this has to be strictly greater-than as the TLABs
johnc@1748 1516 // are capped at the humongous thresold and we want to
johnc@1748 1517 // ensure that we don't try to allocate a TLAB as
johnc@1748 1518 // humongous and that we don't allocate a humongous
johnc@1748 1519 // object in a TLAB.
johnc@1748 1520 return word_size > _humongous_object_threshold_in_words;
ysr@777 1521 }
ysr@777 1522
ysr@777 1523 // Update mod union table with the set of dirty cards.
ysr@777 1524 void updateModUnion();
ysr@777 1525
ysr@777 1526 // Set the mod union bits corresponding to the given memRegion. Note
ysr@777 1527 // that this is always a safe operation, since it doesn't clear any
ysr@777 1528 // bits.
ysr@777 1529 void markModUnionRange(MemRegion mr);
ysr@777 1530
ysr@777 1531 // Records the fact that a marking phase is no longer in progress.
ysr@777 1532 void set_marking_complete() {
ysr@777 1533 _mark_in_progress = false;
ysr@777 1534 }
ysr@777 1535 void set_marking_started() {
ysr@777 1536 _mark_in_progress = true;
ysr@777 1537 }
ysr@777 1538 bool mark_in_progress() {
ysr@777 1539 return _mark_in_progress;
ysr@777 1540 }
ysr@777 1541
ysr@777 1542 // Print the maximum heap capacity.
ysr@777 1543 virtual size_t max_capacity() const;
ysr@777 1544
ysr@777 1545 virtual jlong millis_since_last_gc();
ysr@777 1546
tonyp@2974 1547
ysr@777 1548 // Convenience function to be used in situations where the heap type can be
ysr@777 1549 // asserted to be this type.
ysr@777 1550 static G1CollectedHeap* heap();
ysr@777 1551
ysr@777 1552 void set_region_short_lived_locked(HeapRegion* hr);
ysr@777 1553 // add appropriate methods for any other surv rate groups
ysr@777 1554
brutisso@6376 1555 YoungList* young_list() const { return _young_list; }
ysr@777 1556
ysr@777 1557 // debugging
ysr@777 1558 bool check_young_list_well_formed() {
ysr@777 1559 return _young_list->check_list_well_formed();
ysr@777 1560 }
johnc@1829 1561
johnc@1829 1562 bool check_young_list_empty(bool check_heap,
ysr@777 1563 bool check_sample = true);
ysr@777 1564
ysr@777 1565 // *** Stuff related to concurrent marking. It's not clear to me that so
ysr@777 1566 // many of these need to be public.
ysr@777 1567
ysr@777 1568 // The functions below are helper functions that a subclass of
ysr@777 1569 // "CollectedHeap" can use in the implementation of its virtual
ysr@777 1570 // functions.
ysr@777 1571 // This performs a concurrent marking of the live objects in a
ysr@777 1572 // bitmap off to the side.
ysr@777 1573 void doConcurrentMark();
ysr@777 1574
ysr@777 1575 bool isMarkedPrev(oop obj) const;
ysr@777 1576 bool isMarkedNext(oop obj) const;
ysr@777 1577
ysr@777 1578 // Determine if an object is dead, given the object and also
ysr@777 1579 // the region to which the object belongs. An object is dead
ysr@777 1580 // iff a) it was not allocated since the last mark and b) it
ysr@777 1581 // is not marked.
ysr@777 1582 bool is_obj_dead(const oop obj, const HeapRegion* hr) const {
ysr@777 1583 return
ysr@777 1584 !hr->obj_allocated_since_prev_marking(obj) &&
ysr@777 1585 !isMarkedPrev(obj);
ysr@777 1586 }
ysr@777 1587
ysr@777 1588 // This function returns true when an object has been
ysr@777 1589 // around since the previous marking and hasn't yet
ysr@777 1590 // been marked during this marking.
ysr@777 1591 bool is_obj_ill(const oop obj, const HeapRegion* hr) const {
ysr@777 1592 return
ysr@777 1593 !hr->obj_allocated_since_next_marking(obj) &&
ysr@777 1594 !isMarkedNext(obj);
ysr@777 1595 }
ysr@777 1596
ysr@777 1597 // Determine if an object is dead, given only the object itself.
ysr@777 1598 // This will find the region to which the object belongs and
ysr@777 1599 // then call the region version of the same function.
ysr@777 1600
ysr@777 1601 // Added if it is NULL it isn't dead.
ysr@777 1602
tschatzl@6541 1603 inline bool is_obj_dead(const oop obj) const;
ysr@777 1604
tschatzl@6541 1605 inline bool is_obj_ill(const oop obj) const;
ysr@777 1606
johnc@5548 1607 bool allocated_since_marking(oop obj, HeapRegion* hr, VerifyOption vo);
johnc@5548 1608 HeapWord* top_at_mark_start(HeapRegion* hr, VerifyOption vo);
johnc@5548 1609 bool is_marked(oop obj, VerifyOption vo);
johnc@5548 1610 const char* top_at_mark_start_str(VerifyOption vo);
johnc@5548 1611
johnc@5548 1612 ConcurrentMark* concurrent_mark() const { return _cm; }
johnc@5548 1613
johnc@5548 1614 // Refinement
johnc@5548 1615
johnc@5548 1616 ConcurrentG1Refine* concurrent_g1_refine() const { return _cg1r; }
johnc@5548 1617
johnc@5548 1618 // The dirty cards region list is used to record a subset of regions
johnc@5548 1619 // whose cards need clearing. The list if populated during the
johnc@5548 1620 // remembered set scanning and drained during the card table
johnc@5548 1621 // cleanup. Although the methods are reentrant, population/draining
johnc@5548 1622 // phases must not overlap. For synchronization purposes the last
johnc@5548 1623 // element on the list points to itself.
johnc@5548 1624 HeapRegion* _dirty_cards_region_list;
johnc@5548 1625 void push_dirty_cards_region(HeapRegion* hr);
johnc@5548 1626 HeapRegion* pop_dirty_cards_region();
johnc@5548 1627
johnc@5548 1628 // Optimized nmethod scanning support routines
johnc@5548 1629
johnc@5548 1630 // Register the given nmethod with the G1 heap
johnc@5548 1631 virtual void register_nmethod(nmethod* nm);
johnc@5548 1632
johnc@5548 1633 // Unregister the given nmethod from the G1 heap
johnc@5548 1634 virtual void unregister_nmethod(nmethod* nm);
johnc@5548 1635
tschatzl@6402 1636 // Free up superfluous code root memory.
tschatzl@6402 1637 void purge_code_root_memory();
tschatzl@6402 1638
johnc@5548 1639 // Rebuild the stong code root lists for each region
johnc@5548 1640 // after a full GC
johnc@5548 1641 void rebuild_strong_code_roots();
johnc@5548 1642
tschatzl@6229 1643 // Delete entries for dead interned string and clean up unreferenced symbols
tschatzl@6229 1644 // in symbol table, possibly in parallel.
tschatzl@6229 1645 void unlink_string_and_symbol_table(BoolObjectClosure* is_alive, bool unlink_strings = true, bool unlink_symbols = true);
tschatzl@6229 1646
stefank@6992 1647 // Parallel phase of unloading/cleaning after G1 concurrent mark.
stefank@6992 1648 void parallel_cleaning(BoolObjectClosure* is_alive, bool process_strings, bool process_symbols, bool class_unloading_occurred);
stefank@6992 1649
tschatzl@6405 1650 // Redirty logged cards in the refinement queue.
tschatzl@6405 1651 void redirty_logged_cards();
johnc@5548 1652 // Verification
johnc@5548 1653
johnc@5548 1654 // The following is just to alert the verification code
johnc@5548 1655 // that a full collection has occurred and that the
johnc@5548 1656 // remembered sets are no longer up to date.
johnc@5548 1657 bool _full_collection;
johnc@5548 1658 void set_full_collection() { _full_collection = true;}
johnc@5548 1659 void clear_full_collection() {_full_collection = false;}
johnc@5548 1660 bool full_collection() {return _full_collection;}
johnc@5548 1661
johnc@5548 1662 // Perform any cleanup actions necessary before allowing a verification.
johnc@5548 1663 virtual void prepare_for_verify();
johnc@5548 1664
johnc@5548 1665 // Perform verification.
johnc@5548 1666
johnc@5548 1667 // vo == UsePrevMarking -> use "prev" marking information,
johnc@5548 1668 // vo == UseNextMarking -> use "next" marking information
johnc@5548 1669 // vo == UseMarkWord -> use the mark word in the object header
johnc@5548 1670 //
johnc@5548 1671 // NOTE: Only the "prev" marking information is guaranteed to be
johnc@5548 1672 // consistent most of the time, so most calls to this should use
johnc@5548 1673 // vo == UsePrevMarking.
johnc@5548 1674 // Currently, there is only one case where this is called with
johnc@5548 1675 // vo == UseNextMarking, which is to verify the "next" marking
johnc@5548 1676 // information at the end of remark.
johnc@5548 1677 // Currently there is only one place where this is called with
johnc@5548 1678 // vo == UseMarkWord, which is to verify the marking during a
johnc@5548 1679 // full GC.
johnc@5548 1680 void verify(bool silent, VerifyOption vo);
johnc@5548 1681
johnc@5548 1682 // Override; it uses the "prev" marking information
johnc@5548 1683 virtual void verify(bool silent);
johnc@5548 1684
tonyp@3957 1685 // The methods below are here for convenience and dispatch the
tonyp@3957 1686 // appropriate method depending on value of the given VerifyOption
johnc@5548 1687 // parameter. The values for that parameter, and their meanings,
johnc@5548 1688 // are the same as those above.
tonyp@3957 1689
tonyp@3957 1690 bool is_obj_dead_cond(const oop obj,
tonyp@3957 1691 const HeapRegion* hr,
tschatzl@6541 1692 const VerifyOption vo) const;
tonyp@3957 1693
tonyp@3957 1694 bool is_obj_dead_cond(const oop obj,
tschatzl@6541 1695 const VerifyOption vo) const;
tonyp@3957 1696
johnc@5548 1697 // Printing
tonyp@3957 1698
johnc@5548 1699 virtual void print_on(outputStream* st) const;
johnc@5548 1700 virtual void print_extended_on(outputStream* st) const;
johnc@5548 1701 virtual void print_on_error(outputStream* st) const;
ysr@777 1702
johnc@5548 1703 virtual void print_gc_threads_on(outputStream* st) const;
johnc@5548 1704 virtual void gc_threads_do(ThreadClosure* tc) const;
ysr@777 1705
johnc@5548 1706 // Override
johnc@5548 1707 void print_tracing_info() const;
johnc@5548 1708
johnc@5548 1709 // The following two methods are helpful for debugging RSet issues.
johnc@5548 1710 void print_cset_rsets() PRODUCT_RETURN;
johnc@5548 1711 void print_all_rsets() PRODUCT_RETURN;
apetrusenko@1231 1712
ysr@777 1713 public:
ysr@777 1714 size_t pending_card_num();
ysr@777 1715 size_t cards_scanned();
ysr@777 1716
ysr@777 1717 protected:
ysr@777 1718 size_t _max_heap_capacity;
ysr@777 1719 };
ysr@777 1720
stefank@2314 1721 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1COLLECTEDHEAP_HPP

mercurial