| 1 | /* |
| 2 | * Copyright (c) 2001, 2019, Oracle and/or its affiliates. All rights reserved. |
| 3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| 4 | * |
| 5 | * This code is free software; you can redistribute it and/or modify it |
| 6 | * under the terms of the GNU General Public License version 2 only, as |
| 7 | * published by the Free Software Foundation. |
| 8 | * |
| 9 | * This code is distributed in the hope that it will be useful, but WITHOUT |
| 10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| 11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| 12 | * version 2 for more details (a copy is included in the LICENSE file that |
| 13 | * accompanied this code). |
| 14 | * |
| 15 | * You should have received a copy of the GNU General Public License version |
| 16 | * 2 along with this work; if not, write to the Free Software Foundation, |
| 17 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| 18 | * |
| 19 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| 20 | * or visit www.oracle.com if you need additional information or have any |
| 21 | * questions. |
| 22 | * |
| 23 | */ |
| 24 | |
| 25 | #ifndef SHARE_GC_G1_G1COLLECTEDHEAP_HPP |
| 26 | #define SHARE_GC_G1_G1COLLECTEDHEAP_HPP |
| 27 | |
| 28 | #include "gc/g1/g1BarrierSet.hpp" |
| 29 | #include "gc/g1/g1BiasedArray.hpp" |
| 30 | #include "gc/g1/g1CardTable.hpp" |
| 31 | #include "gc/g1/g1CollectionSet.hpp" |
| 32 | #include "gc/g1/g1CollectorState.hpp" |
| 33 | #include "gc/g1/g1ConcurrentMark.hpp" |
| 34 | #include "gc/g1/g1DirtyCardQueue.hpp" |
| 35 | #include "gc/g1/g1EdenRegions.hpp" |
| 36 | #include "gc/g1/g1EvacFailure.hpp" |
| 37 | #include "gc/g1/g1EvacStats.hpp" |
| 38 | #include "gc/g1/g1EvacuationInfo.hpp" |
| 39 | #include "gc/g1/g1GCPhaseTimes.hpp" |
| 40 | #include "gc/g1/g1HeapTransition.hpp" |
| 41 | #include "gc/g1/g1HeapVerifier.hpp" |
| 42 | #include "gc/g1/g1HRPrinter.hpp" |
| 43 | #include "gc/g1/g1HeapRegionAttr.hpp" |
| 44 | #include "gc/g1/g1MonitoringSupport.hpp" |
| 45 | #include "gc/g1/g1SurvivorRegions.hpp" |
| 46 | #include "gc/g1/g1YCTypes.hpp" |
| 47 | #include "gc/g1/heapRegionManager.hpp" |
| 48 | #include "gc/g1/heapRegionSet.hpp" |
| 49 | #include "gc/g1/heterogeneousHeapRegionManager.hpp" |
| 50 | #include "gc/shared/barrierSet.hpp" |
| 51 | #include "gc/shared/collectedHeap.hpp" |
| 52 | #include "gc/shared/gcHeapSummary.hpp" |
| 53 | #include "gc/shared/plab.hpp" |
| 54 | #include "gc/shared/preservedMarks.hpp" |
| 55 | #include "gc/shared/softRefPolicy.hpp" |
| 56 | #include "memory/memRegion.hpp" |
| 57 | #include "utilities/stack.hpp" |
| 58 | |
| 59 | // A "G1CollectedHeap" is an implementation of a java heap for HotSpot. |
| 60 | // It uses the "Garbage First" heap organization and algorithm, which |
| 61 | // may combine concurrent marking with parallel, incremental compaction of |
| 62 | // heap subsets that will yield large amounts of garbage. |
| 63 | |
| 64 | // Forward declarations |
| 65 | class HeapRegion; |
| 66 | class GenerationSpec; |
| 67 | class G1ParScanThreadState; |
| 68 | class G1ParScanThreadStateSet; |
| 69 | class G1ParScanThreadState; |
| 70 | class MemoryPool; |
| 71 | class MemoryManager; |
| 72 | class ObjectClosure; |
| 73 | class SpaceClosure; |
| 74 | class CompactibleSpaceClosure; |
| 75 | class Space; |
| 76 | class G1CollectionSet; |
| 77 | class G1Policy; |
| 78 | class G1HotCardCache; |
| 79 | class G1RemSet; |
| 80 | class G1YoungRemSetSamplingThread; |
| 81 | class HeapRegionRemSetIterator; |
| 82 | class G1ConcurrentMark; |
| 83 | class G1ConcurrentMarkThread; |
| 84 | class G1ConcurrentRefine; |
| 85 | class GenerationCounters; |
| 86 | class STWGCTimer; |
| 87 | class G1NewTracer; |
| 88 | class EvacuationFailedInfo; |
| 89 | class nmethod; |
| 90 | class WorkGang; |
| 91 | class G1Allocator; |
| 92 | class G1ArchiveAllocator; |
| 93 | class G1FullGCScope; |
| 94 | class G1HeapVerifier; |
| 95 | class G1HeapSizingPolicy; |
| 96 | class G1HeapSummary; |
| 97 | class G1EvacSummary; |
| 98 | |
| 99 | typedef OverflowTaskQueue<StarTask, mtGC> RefToScanQueue; |
| 100 | typedef GenericTaskQueueSet<RefToScanQueue, mtGC> RefToScanQueueSet; |
| 101 | |
| 102 | typedef int RegionIdx_t; // needs to hold [ 0..max_regions() ) |
| 103 | typedef int CardIdx_t; // needs to hold [ 0..CardsPerRegion ) |
| 104 | |
| 105 | // The G1 STW is alive closure. |
| 106 | // An instance is embedded into the G1CH and used as the |
| 107 | // (optional) _is_alive_non_header closure in the STW |
| 108 | // reference processor. It is also extensively used during |
| 109 | // reference processing during STW evacuation pauses. |
| 110 | class G1STWIsAliveClosure : public BoolObjectClosure { |
| 111 | G1CollectedHeap* _g1h; |
| 112 | public: |
| 113 | G1STWIsAliveClosure(G1CollectedHeap* g1h) : _g1h(g1h) {} |
| 114 | bool do_object_b(oop p); |
| 115 | }; |
| 116 | |
| 117 | class G1STWSubjectToDiscoveryClosure : public BoolObjectClosure { |
| 118 | G1CollectedHeap* _g1h; |
| 119 | public: |
| 120 | G1STWSubjectToDiscoveryClosure(G1CollectedHeap* g1h) : _g1h(g1h) {} |
| 121 | bool do_object_b(oop p); |
| 122 | }; |
| 123 | |
| 124 | class G1RegionMappingChangedListener : public G1MappingChangedListener { |
| 125 | private: |
| 126 | void reset_from_card_cache(uint start_idx, size_t num_regions); |
| 127 | public: |
| 128 | virtual void on_commit(uint start_idx, size_t num_regions, bool zero_filled); |
| 129 | }; |
| 130 | |
| 131 | class G1CollectedHeap : public CollectedHeap { |
| 132 | friend class G1FreeCollectionSetTask; |
| 133 | friend class VM_CollectForMetadataAllocation; |
| 134 | friend class VM_G1CollectForAllocation; |
| 135 | friend class VM_G1CollectFull; |
| 136 | friend class VMStructs; |
| 137 | friend class MutatorAllocRegion; |
| 138 | friend class G1FullCollector; |
| 139 | friend class G1GCAllocRegion; |
| 140 | friend class G1HeapVerifier; |
| 141 | |
| 142 | // Closures used in implementation. |
| 143 | friend class G1ParScanThreadState; |
| 144 | friend class G1ParScanThreadStateSet; |
| 145 | friend class G1EvacuateRegionsTask; |
| 146 | friend class G1PLABAllocator; |
| 147 | |
| 148 | // Other related classes. |
| 149 | friend class HeapRegionClaimer; |
| 150 | |
| 151 | // Testing classes. |
| 152 | friend class G1CheckRegionAttrTableClosure; |
| 153 | |
| 154 | private: |
| 155 | G1YoungRemSetSamplingThread* _young_gen_sampling_thread; |
| 156 | |
| 157 | WorkGang* _workers; |
| 158 | G1CardTable* _card_table; |
| 159 | |
| 160 | SoftRefPolicy _soft_ref_policy; |
| 161 | |
| 162 | static size_t _humongous_object_threshold_in_words; |
| 163 | |
| 164 | // These sets keep track of old, archive and humongous regions respectively. |
| 165 | HeapRegionSet _old_set; |
| 166 | HeapRegionSet _archive_set; |
| 167 | HeapRegionSet _humongous_set; |
| 168 | |
| 169 | void eagerly_reclaim_humongous_regions(); |
| 170 | // Start a new incremental collection set for the next pause. |
| 171 | void start_new_collection_set(); |
| 172 | |
| 173 | // The block offset table for the G1 heap. |
| 174 | G1BlockOffsetTable* _bot; |
| 175 | |
| 176 | // Tears down the region sets / lists so that they are empty and the |
| 177 | // regions on the heap do not belong to a region set / list. The |
| 178 | // only exception is the humongous set which we leave unaltered. If |
| 179 | // free_list_only is true, it will only tear down the master free |
| 180 | // list. It is called before a Full GC (free_list_only == false) or |
| 181 | // before heap shrinking (free_list_only == true). |
| 182 | void tear_down_region_sets(bool free_list_only); |
| 183 | |
| 184 | // Rebuilds the region sets / lists so that they are repopulated to |
| 185 | // reflect the contents of the heap. The only exception is the |
| 186 | // humongous set which was not torn down in the first place. If |
| 187 | // free_list_only is true, it will only rebuild the master free |
| 188 | // list. It is called after a Full GC (free_list_only == false) or |
| 189 | // after heap shrinking (free_list_only == true). |
| 190 | void rebuild_region_sets(bool free_list_only); |
| 191 | |
| 192 | // Callback for region mapping changed events. |
| 193 | G1RegionMappingChangedListener _listener; |
| 194 | |
| 195 | // The sequence of all heap regions in the heap. |
| 196 | HeapRegionManager* _hrm; |
| 197 | |
| 198 | // Manages all allocations with regions except humongous object allocations. |
| 199 | G1Allocator* _allocator; |
| 200 | |
| 201 | // Manages all heap verification. |
| 202 | G1HeapVerifier* _verifier; |
| 203 | |
| 204 | // Outside of GC pauses, the number of bytes used in all regions other |
| 205 | // than the current allocation region(s). |
| 206 | volatile size_t _summary_bytes_used; |
| 207 | |
| 208 | void increase_used(size_t bytes); |
| 209 | void decrease_used(size_t bytes); |
| 210 | |
| 211 | void set_used(size_t bytes); |
| 212 | |
| 213 | // Class that handles archive allocation ranges. |
| 214 | G1ArchiveAllocator* _archive_allocator; |
| 215 | |
| 216 | // GC allocation statistics policy for survivors. |
| 217 | G1EvacStats _survivor_evac_stats; |
| 218 | |
| 219 | // GC allocation statistics policy for tenured objects. |
| 220 | G1EvacStats _old_evac_stats; |
| 221 | |
| 222 | // It specifies whether we should attempt to expand the heap after a |
| 223 | // region allocation failure. If heap expansion fails we set this to |
| 224 | // false so that we don't re-attempt the heap expansion (it's likely |
| 225 | // that subsequent expansion attempts will also fail if one fails). |
| 226 | // Currently, it is only consulted during GC and it's reset at the |
| 227 | // start of each GC. |
| 228 | bool _expand_heap_after_alloc_failure; |
| 229 | |
| 230 | // Helper for monitoring and management support. |
| 231 | G1MonitoringSupport* _g1mm; |
| 232 | |
| 233 | // Records whether the region at the given index is (still) a |
| 234 | // candidate for eager reclaim. Only valid for humongous start |
| 235 | // regions; other regions have unspecified values. Humongous start |
| 236 | // regions are initialized at start of collection pause, with |
| 237 | // candidates removed from the set as they are found reachable from |
| 238 | // roots or the young generation. |
| 239 | class HumongousReclaimCandidates : public G1BiasedMappedArray<bool> { |
| 240 | protected: |
| 241 | bool default_value() const { return false; } |
| 242 | public: |
| 243 | void clear() { G1BiasedMappedArray<bool>::clear(); } |
| 244 | void set_candidate(uint region, bool value) { |
| 245 | set_by_index(region, value); |
| 246 | } |
| 247 | bool is_candidate(uint region) { |
| 248 | return get_by_index(region); |
| 249 | } |
| 250 | }; |
| 251 | |
| 252 | HumongousReclaimCandidates _humongous_reclaim_candidates; |
| 253 | // Stores whether during humongous object registration we found candidate regions. |
| 254 | // If not, we can skip a few steps. |
| 255 | bool _has_humongous_reclaim_candidates; |
| 256 | |
| 257 | G1HRPrinter _hr_printer; |
| 258 | |
| 259 | // It decides whether an explicit GC should start a concurrent cycle |
| 260 | // instead of doing a STW GC. Currently, a concurrent cycle is |
| 261 | // explicitly started if: |
| 262 | // (a) cause == _gc_locker and +GCLockerInvokesConcurrent, or |
| 263 | // (b) cause == _g1_humongous_allocation |
| 264 | // (c) cause == _java_lang_system_gc and +ExplicitGCInvokesConcurrent. |
| 265 | // (d) cause == _dcmd_gc_run and +ExplicitGCInvokesConcurrent. |
| 266 | // (e) cause == _wb_conc_mark |
| 267 | bool should_do_concurrent_full_gc(GCCause::Cause cause); |
| 268 | |
| 269 | // Return true if should upgrade to full gc after an incremental one. |
| 270 | bool should_upgrade_to_full_gc(GCCause::Cause cause); |
| 271 | |
| 272 | // indicates whether we are in young or mixed GC mode |
| 273 | G1CollectorState _collector_state; |
| 274 | |
| 275 | // Keeps track of how many "old marking cycles" (i.e., Full GCs or |
| 276 | // concurrent cycles) we have started. |
| 277 | volatile uint _old_marking_cycles_started; |
| 278 | |
| 279 | // Keeps track of how many "old marking cycles" (i.e., Full GCs or |
| 280 | // concurrent cycles) we have completed. |
| 281 | volatile uint _old_marking_cycles_completed; |
| 282 | |
| 283 | // This is a non-product method that is helpful for testing. It is |
| 284 | // called at the end of a GC and artificially expands the heap by |
| 285 | // allocating a number of dead regions. This way we can induce very |
| 286 | // frequent marking cycles and stress the cleanup / concurrent |
| 287 | // cleanup code more (as all the regions that will be allocated by |
| 288 | // this method will be found dead by the marking cycle). |
| 289 | void allocate_dummy_regions() PRODUCT_RETURN; |
| 290 | |
| 291 | // If the HR printer is active, dump the state of the regions in the |
| 292 | // heap after a compaction. |
| 293 | void print_hrm_post_compaction(); |
| 294 | |
| 295 | // Create a memory mapper for auxiliary data structures of the given size and |
| 296 | // translation factor. |
| 297 | static G1RegionToSpaceMapper* create_aux_memory_mapper(const char* description, |
| 298 | size_t size, |
| 299 | size_t translation_factor); |
| 300 | |
| 301 | void trace_heap(GCWhen::Type when, const GCTracer* tracer); |
| 302 | |
| 303 | // These are macros so that, if the assert fires, we get the correct |
| 304 | // line number, file, etc. |
| 305 | |
| 306 | #define heap_locking_asserts_params(_extra_message_) \ |
| 307 | "%s : Heap_lock locked: %s, at safepoint: %s, is VM thread: %s", \ |
| 308 | (_extra_message_), \ |
| 309 | BOOL_TO_STR(Heap_lock->owned_by_self()), \ |
| 310 | BOOL_TO_STR(SafepointSynchronize::is_at_safepoint()), \ |
| 311 | BOOL_TO_STR(Thread::current()->is_VM_thread()) |
| 312 | |
| 313 | #define assert_heap_locked() \ |
| 314 | do { \ |
| 315 | assert(Heap_lock->owned_by_self(), \ |
| 316 | heap_locking_asserts_params("should be holding the Heap_lock")); \ |
| 317 | } while (0) |
| 318 | |
| 319 | #define assert_heap_locked_or_at_safepoint(_should_be_vm_thread_) \ |
| 320 | do { \ |
| 321 | assert(Heap_lock->owned_by_self() || \ |
| 322 | (SafepointSynchronize::is_at_safepoint() && \ |
| 323 | ((_should_be_vm_thread_) == Thread::current()->is_VM_thread())), \ |
| 324 | heap_locking_asserts_params("should be holding the Heap_lock or " \ |
| 325 | "should be at a safepoint")); \ |
| 326 | } while (0) |
| 327 | |
| 328 | #define assert_heap_locked_and_not_at_safepoint() \ |
| 329 | do { \ |
| 330 | assert(Heap_lock->owned_by_self() && \ |
| 331 | !SafepointSynchronize::is_at_safepoint(), \ |
| 332 | heap_locking_asserts_params("should be holding the Heap_lock and " \ |
| 333 | "should not be at a safepoint")); \ |
| 334 | } while (0) |
| 335 | |
| 336 | #define assert_heap_not_locked() \ |
| 337 | do { \ |
| 338 | assert(!Heap_lock->owned_by_self(), \ |
| 339 | heap_locking_asserts_params("should not be holding the Heap_lock")); \ |
| 340 | } while (0) |
| 341 | |
| 342 | #define assert_heap_not_locked_and_not_at_safepoint() \ |
| 343 | do { \ |
| 344 | assert(!Heap_lock->owned_by_self() && \ |
| 345 | !SafepointSynchronize::is_at_safepoint(), \ |
| 346 | heap_locking_asserts_params("should not be holding the Heap_lock and " \ |
| 347 | "should not be at a safepoint")); \ |
| 348 | } while (0) |
| 349 | |
| 350 | #define assert_at_safepoint_on_vm_thread() \ |
| 351 | do { \ |
| 352 | assert_at_safepoint(); \ |
| 353 | assert(Thread::current_or_null() != NULL, "no current thread"); \ |
| 354 | assert(Thread::current()->is_VM_thread(), "current thread is not VM thread"); \ |
| 355 | } while (0) |
| 356 | |
| 357 | #define assert_used_and_recalculate_used_equal(g1h) \ |
| 358 | do { \ |
| 359 | size_t cur_used_bytes = g1h->used(); \ |
| 360 | size_t recal_used_bytes = g1h->recalculate_used(); \ |
| 361 | assert(cur_used_bytes == recal_used_bytes, "Used(" SIZE_FORMAT ") is not" \ |
| 362 | " same as recalculated used(" SIZE_FORMAT ").", \ |
| 363 | cur_used_bytes, recal_used_bytes); \ |
| 364 | } while (0) |
| 365 | |
| 366 | const char* young_gc_name() const; |
| 367 | |
| 368 | // The young region list. |
| 369 | G1EdenRegions _eden; |
| 370 | G1SurvivorRegions _survivor; |
| 371 | |
| 372 | STWGCTimer* _gc_timer_stw; |
| 373 | |
| 374 | G1NewTracer* _gc_tracer_stw; |
| 375 | |
| 376 | // The current policy object for the collector. |
| 377 | G1Policy* _policy; |
| 378 | G1HeapSizingPolicy* _heap_sizing_policy; |
| 379 | |
| 380 | G1CollectionSet _collection_set; |
| 381 | |
| 382 | // Try to allocate a single non-humongous HeapRegion sufficient for |
| 383 | // an allocation of the given word_size. If do_expand is true, |
| 384 | // attempt to expand the heap if necessary to satisfy the allocation |
| 385 | // request. 'type' takes the type of region to be allocated. (Use constants |
| 386 | // Old, Eden, Humongous, Survivor defined in HeapRegionType.) |
| 387 | HeapRegion* new_region(size_t word_size, HeapRegionType type, bool do_expand); |
| 388 | |
| 389 | // Initialize a contiguous set of free regions of length num_regions |
| 390 | // and starting at index first so that they appear as a single |
| 391 | // humongous region. |
| 392 | HeapWord* humongous_obj_allocate_initialize_regions(uint first, |
| 393 | uint num_regions, |
| 394 | size_t word_size); |
| 395 | |
| 396 | // Attempt to allocate a humongous object of the given size. Return |
| 397 | // NULL if unsuccessful. |
| 398 | HeapWord* humongous_obj_allocate(size_t word_size); |
| 399 | |
| 400 | // The following two methods, allocate_new_tlab() and |
| 401 | // mem_allocate(), are the two main entry points from the runtime |
| 402 | // into the G1's allocation routines. They have the following |
| 403 | // assumptions: |
| 404 | // |
| 405 | // * They should both be called outside safepoints. |
| 406 | // |
| 407 | // * They should both be called without holding the Heap_lock. |
| 408 | // |
| 409 | // * All allocation requests for new TLABs should go to |
| 410 | // allocate_new_tlab(). |
| 411 | // |
| 412 | // * All non-TLAB allocation requests should go to mem_allocate(). |
| 413 | // |
| 414 | // * If either call cannot satisfy the allocation request using the |
| 415 | // current allocating region, they will try to get a new one. If |
| 416 | // this fails, they will attempt to do an evacuation pause and |
| 417 | // retry the allocation. |
| 418 | // |
| 419 | // * If all allocation attempts fail, even after trying to schedule |
| 420 | // an evacuation pause, allocate_new_tlab() will return NULL, |
| 421 | // whereas mem_allocate() will attempt a heap expansion and/or |
| 422 | // schedule a Full GC. |
| 423 | // |
| 424 | // * We do not allow humongous-sized TLABs. So, allocate_new_tlab |
| 425 | // should never be called with word_size being humongous. All |
| 426 | // humongous allocation requests should go to mem_allocate() which |
| 427 | // will satisfy them with a special path. |
| 428 | |
| 429 | virtual HeapWord* allocate_new_tlab(size_t min_size, |
| 430 | size_t requested_size, |
| 431 | size_t* actual_size); |
| 432 | |
| 433 | virtual HeapWord* mem_allocate(size_t word_size, |
| 434 | bool* gc_overhead_limit_was_exceeded); |
| 435 | |
| 436 | // First-level mutator allocation attempt: try to allocate out of |
| 437 | // the mutator alloc region without taking the Heap_lock. This |
| 438 | // should only be used for non-humongous allocations. |
| 439 | inline HeapWord* attempt_allocation(size_t min_word_size, |
| 440 | size_t desired_word_size, |
| 441 | size_t* actual_word_size); |
| 442 | |
| 443 | // Second-level mutator allocation attempt: take the Heap_lock and |
| 444 | // retry the allocation attempt, potentially scheduling a GC |
| 445 | // pause. This should only be used for non-humongous allocations. |
| 446 | HeapWord* attempt_allocation_slow(size_t word_size); |
| 447 | |
| 448 | // Takes the Heap_lock and attempts a humongous allocation. It can |
| 449 | // potentially schedule a GC pause. |
| 450 | HeapWord* attempt_allocation_humongous(size_t word_size); |
| 451 | |
| 452 | // Allocation attempt that should be called during safepoints (e.g., |
| 453 | // at the end of a successful GC). expect_null_mutator_alloc_region |
| 454 | // specifies whether the mutator alloc region is expected to be NULL |
| 455 | // or not. |
| 456 | HeapWord* attempt_allocation_at_safepoint(size_t word_size, |
| 457 | bool expect_null_mutator_alloc_region); |
| 458 | |
| 459 | // These methods are the "callbacks" from the G1AllocRegion class. |
| 460 | |
| 461 | // For mutator alloc regions. |
| 462 | HeapRegion* new_mutator_alloc_region(size_t word_size, bool force); |
| 463 | void retire_mutator_alloc_region(HeapRegion* alloc_region, |
| 464 | size_t allocated_bytes); |
| 465 | |
| 466 | // For GC alloc regions. |
| 467 | bool has_more_regions(G1HeapRegionAttr dest); |
| 468 | HeapRegion* new_gc_alloc_region(size_t word_size, G1HeapRegionAttr dest); |
| 469 | void retire_gc_alloc_region(HeapRegion* alloc_region, |
| 470 | size_t allocated_bytes, G1HeapRegionAttr dest); |
| 471 | |
| 472 | // - if explicit_gc is true, the GC is for a System.gc() etc, |
| 473 | // otherwise it's for a failed allocation. |
| 474 | // - if clear_all_soft_refs is true, all soft references should be |
| 475 | // cleared during the GC. |
| 476 | // - it returns false if it is unable to do the collection due to the |
| 477 | // GC locker being active, true otherwise. |
| 478 | bool do_full_collection(bool explicit_gc, |
| 479 | bool clear_all_soft_refs); |
| 480 | |
| 481 | // Callback from VM_G1CollectFull operation, or collect_as_vm_thread. |
| 482 | virtual void do_full_collection(bool clear_all_soft_refs); |
| 483 | |
| 484 | // Callback from VM_G1CollectForAllocation operation. |
| 485 | // This function does everything necessary/possible to satisfy a |
| 486 | // failed allocation request (including collection, expansion, etc.) |
| 487 | HeapWord* satisfy_failed_allocation(size_t word_size, |
| 488 | bool* succeeded); |
| 489 | // Internal helpers used during full GC to split it up to |
| 490 | // increase readability. |
| 491 | void abort_concurrent_cycle(); |
| 492 | void verify_before_full_collection(bool explicit_gc); |
| 493 | void prepare_heap_for_full_collection(); |
| 494 | void prepare_heap_for_mutators(); |
| 495 | void abort_refinement(); |
| 496 | void verify_after_full_collection(); |
| 497 | void print_heap_after_full_collection(G1HeapTransition* heap_transition); |
| 498 | |
| 499 | // Helper method for satisfy_failed_allocation() |
| 500 | HeapWord* satisfy_failed_allocation_helper(size_t word_size, |
| 501 | bool do_gc, |
| 502 | bool clear_all_soft_refs, |
| 503 | bool expect_null_mutator_alloc_region, |
| 504 | bool* gc_succeeded); |
| 505 | |
| 506 | // Attempting to expand the heap sufficiently |
| 507 | // to support an allocation of the given "word_size". If |
| 508 | // successful, perform the allocation and return the address of the |
| 509 | // allocated block, or else "NULL". |
| 510 | HeapWord* expand_and_allocate(size_t word_size); |
| 511 | |
| 512 | // Process any reference objects discovered. |
| 513 | void process_discovered_references(G1ParScanThreadStateSet* per_thread_states); |
| 514 | |
| 515 | // If during an initial mark pause we may install a pending list head which is not |
| 516 | // otherwise reachable ensure that it is marked in the bitmap for concurrent marking |
| 517 | // to discover. |
| 518 | void make_pending_list_reachable(); |
| 519 | |
| 520 | // Merges the information gathered on a per-thread basis for all worker threads |
| 521 | // during GC into global variables. |
| 522 | void merge_per_thread_state_info(G1ParScanThreadStateSet* per_thread_states); |
| 523 | public: |
| 524 | G1YoungRemSetSamplingThread* sampling_thread() const { return _young_gen_sampling_thread; } |
| 525 | |
| 526 | WorkGang* workers() const { return _workers; } |
| 527 | |
| 528 | // Runs the given AbstractGangTask with the current active workers, returning the |
| 529 | // total time taken. |
| 530 | Tickspan run_task(AbstractGangTask* task); |
| 531 | |
| 532 | G1Allocator* allocator() { |
| 533 | return _allocator; |
| 534 | } |
| 535 | |
| 536 | G1HeapVerifier* verifier() { |
| 537 | return _verifier; |
| 538 | } |
| 539 | |
| 540 | G1MonitoringSupport* g1mm() { |
| 541 | assert(_g1mm != NULL, "should have been initialized" ); |
| 542 | return _g1mm; |
| 543 | } |
| 544 | |
| 545 | void resize_heap_if_necessary(); |
| 546 | |
| 547 | // Expand the garbage-first heap by at least the given size (in bytes!). |
| 548 | // Returns true if the heap was expanded by the requested amount; |
| 549 | // false otherwise. |
| 550 | // (Rounds up to a HeapRegion boundary.) |
| 551 | bool expand(size_t expand_bytes, WorkGang* pretouch_workers = NULL, double* expand_time_ms = NULL); |
| 552 | |
| 553 | // Returns the PLAB statistics for a given destination. |
| 554 | inline G1EvacStats* alloc_buffer_stats(G1HeapRegionAttr dest); |
| 555 | |
| 556 | // Determines PLAB size for a given destination. |
| 557 | inline size_t desired_plab_sz(G1HeapRegionAttr dest); |
| 558 | |
| 559 | // Do anything common to GC's. |
| 560 | void gc_prologue(bool full); |
| 561 | void gc_epilogue(bool full); |
| 562 | |
| 563 | // Does the given region fulfill remembered set based eager reclaim candidate requirements? |
| 564 | bool is_potential_eager_reclaim_candidate(HeapRegion* r) const; |
| 565 | |
| 566 | // Modify the reclaim candidate set and test for presence. |
| 567 | // These are only valid for starts_humongous regions. |
| 568 | inline void set_humongous_reclaim_candidate(uint region, bool value); |
| 569 | inline bool is_humongous_reclaim_candidate(uint region); |
| 570 | |
| 571 | // Remove from the reclaim candidate set. Also remove from the |
| 572 | // collection set so that later encounters avoid the slow path. |
| 573 | inline void set_humongous_is_live(oop obj); |
| 574 | |
| 575 | // Register the given region to be part of the collection set. |
| 576 | inline void register_humongous_region_with_region_attr(uint index); |
| 577 | // Update region attributes table with information about all regions. |
| 578 | void register_regions_with_region_attr(); |
| 579 | // We register a region with the fast "in collection set" test. We |
| 580 | // simply set to true the array slot corresponding to this region. |
| 581 | void register_young_region_with_region_attr(HeapRegion* r) { |
| 582 | _region_attr.set_in_young(r->hrm_index()); |
| 583 | } |
| 584 | inline void register_region_with_region_attr(HeapRegion* r); |
| 585 | inline void register_old_region_with_region_attr(HeapRegion* r); |
| 586 | inline void register_optional_region_with_region_attr(HeapRegion* r); |
| 587 | |
| 588 | void clear_region_attr(const HeapRegion* hr) { |
| 589 | _region_attr.clear(hr); |
| 590 | } |
| 591 | |
| 592 | void clear_region_attr() { |
| 593 | _region_attr.clear(); |
| 594 | } |
| 595 | |
| 596 | // Verify that the G1RegionAttr remset tracking corresponds to actual remset tracking |
| 597 | // for all regions. |
| 598 | void verify_region_attr_remset_update() PRODUCT_RETURN; |
| 599 | |
| 600 | bool is_user_requested_concurrent_full_gc(GCCause::Cause cause); |
| 601 | |
| 602 | // This is called at the start of either a concurrent cycle or a Full |
| 603 | // GC to update the number of old marking cycles started. |
| 604 | void increment_old_marking_cycles_started(); |
| 605 | |
| 606 | // This is called at the end of either a concurrent cycle or a Full |
| 607 | // GC to update the number of old marking cycles completed. Those two |
| 608 | // can happen in a nested fashion, i.e., we start a concurrent |
| 609 | // cycle, a Full GC happens half-way through it which ends first, |
| 610 | // and then the cycle notices that a Full GC happened and ends |
| 611 | // too. The concurrent parameter is a boolean to help us do a bit |
| 612 | // tighter consistency checking in the method. If concurrent is |
| 613 | // false, the caller is the inner caller in the nesting (i.e., the |
| 614 | // Full GC). If concurrent is true, the caller is the outer caller |
| 615 | // in this nesting (i.e., the concurrent cycle). Further nesting is |
| 616 | // not currently supported. The end of this call also notifies |
| 617 | // the FullGCCount_lock in case a Java thread is waiting for a full |
| 618 | // GC to happen (e.g., it called System.gc() with |
| 619 | // +ExplicitGCInvokesConcurrent). |
| 620 | void increment_old_marking_cycles_completed(bool concurrent); |
| 621 | |
| 622 | uint old_marking_cycles_completed() { |
| 623 | return _old_marking_cycles_completed; |
| 624 | } |
| 625 | |
| 626 | G1HRPrinter* hr_printer() { return &_hr_printer; } |
| 627 | |
| 628 | // Allocates a new heap region instance. |
| 629 | HeapRegion* new_heap_region(uint hrs_index, MemRegion mr); |
| 630 | |
| 631 | // Allocate the highest free region in the reserved heap. This will commit |
| 632 | // regions as necessary. |
| 633 | HeapRegion* alloc_highest_free_region(); |
| 634 | |
| 635 | // Frees a non-humongous region by initializing its contents and |
| 636 | // adding it to the free list that's passed as a parameter (this is |
| 637 | // usually a local list which will be appended to the master free |
| 638 | // list later). The used bytes of freed regions are accumulated in |
| 639 | // pre_used. If skip_remset is true, the region's RSet will not be freed |
| 640 | // up. If skip_hot_card_cache is true, the region's hot card cache will not |
| 641 | // be freed up. The assumption is that this will be done later. |
| 642 | // The locked parameter indicates if the caller has already taken |
| 643 | // care of proper synchronization. This may allow some optimizations. |
| 644 | void free_region(HeapRegion* hr, |
| 645 | FreeRegionList* free_list, |
| 646 | bool skip_remset, |
| 647 | bool skip_hot_card_cache = false, |
| 648 | bool locked = false); |
| 649 | |
| 650 | // It dirties the cards that cover the block so that the post |
| 651 | // write barrier never queues anything when updating objects on this |
| 652 | // block. It is assumed (and in fact we assert) that the block |
| 653 | // belongs to a young region. |
| 654 | inline void dirty_young_block(HeapWord* start, size_t word_size); |
| 655 | |
| 656 | // Frees a humongous region by collapsing it into individual regions |
| 657 | // and calling free_region() for each of them. The freed regions |
| 658 | // will be added to the free list that's passed as a parameter (this |
| 659 | // is usually a local list which will be appended to the master free |
| 660 | // list later). |
| 661 | // The method assumes that only a single thread is ever calling |
| 662 | // this for a particular region at once. |
| 663 | void free_humongous_region(HeapRegion* hr, |
| 664 | FreeRegionList* free_list); |
| 665 | |
| 666 | // Facility for allocating in 'archive' regions in high heap memory and |
| 667 | // recording the allocated ranges. These should all be called from the |
| 668 | // VM thread at safepoints, without the heap lock held. They can be used |
| 669 | // to create and archive a set of heap regions which can be mapped at the |
| 670 | // same fixed addresses in a subsequent JVM invocation. |
| 671 | void begin_archive_alloc_range(bool open = false); |
| 672 | |
| 673 | // Check if the requested size would be too large for an archive allocation. |
| 674 | bool is_archive_alloc_too_large(size_t word_size); |
| 675 | |
| 676 | // Allocate memory of the requested size from the archive region. This will |
| 677 | // return NULL if the size is too large or if no memory is available. It |
| 678 | // does not trigger a garbage collection. |
| 679 | HeapWord* archive_mem_allocate(size_t word_size); |
| 680 | |
| 681 | // Optionally aligns the end address and returns the allocated ranges in |
| 682 | // an array of MemRegions in order of ascending addresses. |
| 683 | void end_archive_alloc_range(GrowableArray<MemRegion>* ranges, |
| 684 | size_t end_alignment_in_bytes = 0); |
| 685 | |
| 686 | // Facility for allocating a fixed range within the heap and marking |
| 687 | // the containing regions as 'archive'. For use at JVM init time, when the |
| 688 | // caller may mmap archived heap data at the specified range(s). |
| 689 | // Verify that the MemRegions specified in the argument array are within the |
| 690 | // reserved heap. |
| 691 | bool check_archive_addresses(MemRegion* range, size_t count); |
| 692 | |
| 693 | // Commit the appropriate G1 regions containing the specified MemRegions |
| 694 | // and mark them as 'archive' regions. The regions in the array must be |
| 695 | // non-overlapping and in order of ascending address. |
| 696 | bool alloc_archive_regions(MemRegion* range, size_t count, bool open); |
| 697 | |
| 698 | // Insert any required filler objects in the G1 regions around the specified |
| 699 | // ranges to make the regions parseable. This must be called after |
| 700 | // alloc_archive_regions, and after class loading has occurred. |
| 701 | void fill_archive_regions(MemRegion* range, size_t count); |
| 702 | |
| 703 | // For each of the specified MemRegions, uncommit the containing G1 regions |
| 704 | // which had been allocated by alloc_archive_regions. This should be called |
| 705 | // rather than fill_archive_regions at JVM init time if the archive file |
| 706 | // mapping failed, with the same non-overlapping and sorted MemRegion array. |
| 707 | void dealloc_archive_regions(MemRegion* range, size_t count, bool is_open); |
| 708 | |
| 709 | oop materialize_archived_object(oop obj); |
| 710 | |
| 711 | private: |
| 712 | |
| 713 | // Shrink the garbage-first heap by at most the given size (in bytes!). |
| 714 | // (Rounds down to a HeapRegion boundary.) |
| 715 | void shrink(size_t expand_bytes); |
| 716 | void shrink_helper(size_t expand_bytes); |
| 717 | |
| 718 | #if TASKQUEUE_STATS |
| 719 | static void print_taskqueue_stats_hdr(outputStream* const st); |
| 720 | void print_taskqueue_stats() const; |
| 721 | void reset_taskqueue_stats(); |
| 722 | #endif // TASKQUEUE_STATS |
| 723 | |
| 724 | // Schedule the VM operation that will do an evacuation pause to |
| 725 | // satisfy an allocation request of word_size. *succeeded will |
| 726 | // return whether the VM operation was successful (it did do an |
| 727 | // evacuation pause) or not (another thread beat us to it or the GC |
| 728 | // locker was active). Given that we should not be holding the |
| 729 | // Heap_lock when we enter this method, we will pass the |
| 730 | // gc_count_before (i.e., total_collections()) as a parameter since |
| 731 | // it has to be read while holding the Heap_lock. Currently, both |
| 732 | // methods that call do_collection_pause() release the Heap_lock |
| 733 | // before the call, so it's easy to read gc_count_before just before. |
| 734 | HeapWord* do_collection_pause(size_t word_size, |
| 735 | uint gc_count_before, |
| 736 | bool* succeeded, |
| 737 | GCCause::Cause gc_cause); |
| 738 | |
| 739 | void wait_for_root_region_scanning(); |
| 740 | |
| 741 | // The guts of the incremental collection pause, executed by the vm |
| 742 | // thread. It returns false if it is unable to do the collection due |
| 743 | // to the GC locker being active, true otherwise |
| 744 | bool do_collection_pause_at_safepoint(double target_pause_time_ms); |
| 745 | |
| 746 | G1HeapVerifier::G1VerifyType young_collection_verify_type() const; |
| 747 | void verify_before_young_collection(G1HeapVerifier::G1VerifyType type); |
| 748 | void verify_after_young_collection(G1HeapVerifier::G1VerifyType type); |
| 749 | |
| 750 | void calculate_collection_set(G1EvacuationInfo& evacuation_info, double target_pause_time_ms); |
| 751 | |
| 752 | // Actually do the work of evacuating the parts of the collection set. |
| 753 | void evacuate_initial_collection_set(G1ParScanThreadStateSet* per_thread_states); |
| 754 | void evacuate_optional_collection_set(G1ParScanThreadStateSet* per_thread_states); |
| 755 | private: |
| 756 | // Evacuate the next set of optional regions. |
| 757 | void evacuate_next_optional_regions(G1ParScanThreadStateSet* per_thread_states); |
| 758 | |
| 759 | public: |
| 760 | void pre_evacuate_collection_set(G1EvacuationInfo& evacuation_info); |
| 761 | void post_evacuate_collection_set(G1EvacuationInfo& evacuation_info, G1ParScanThreadStateSet* pss); |
| 762 | |
| 763 | void expand_heap_after_young_collection(); |
| 764 | // Update object copying statistics. |
| 765 | void record_obj_copy_mem_stats(); |
| 766 | |
| 767 | // The hot card cache for remembered set insertion optimization. |
| 768 | G1HotCardCache* _hot_card_cache; |
| 769 | |
| 770 | // The g1 remembered set of the heap. |
| 771 | G1RemSet* _rem_set; |
| 772 | |
| 773 | // A set of cards that cover the objects for which the Rsets should be updated |
| 774 | // concurrently after the collection. |
| 775 | G1DirtyCardQueueSet _dirty_card_queue_set; |
| 776 | |
| 777 | // After a collection pause, convert the regions in the collection set into free |
| 778 | // regions. |
| 779 | void free_collection_set(G1CollectionSet* collection_set, G1EvacuationInfo& evacuation_info, const size_t* surviving_young_words); |
| 780 | |
| 781 | // Abandon the current collection set without recording policy |
| 782 | // statistics or updating free lists. |
| 783 | void abandon_collection_set(G1CollectionSet* collection_set); |
| 784 | |
| 785 | // The concurrent marker (and the thread it runs in.) |
| 786 | G1ConcurrentMark* _cm; |
| 787 | G1ConcurrentMarkThread* _cm_thread; |
| 788 | |
| 789 | // The concurrent refiner. |
| 790 | G1ConcurrentRefine* _cr; |
| 791 | |
| 792 | // The parallel task queues |
| 793 | RefToScanQueueSet *_task_queues; |
| 794 | |
| 795 | // True iff a evacuation has failed in the current collection. |
| 796 | bool _evacuation_failed; |
| 797 | |
| 798 | EvacuationFailedInfo* _evacuation_failed_info_array; |
| 799 | |
| 800 | // Failed evacuations cause some logical from-space objects to have |
| 801 | // forwarding pointers to themselves. Reset them. |
| 802 | void remove_self_forwarding_pointers(); |
| 803 | |
| 804 | // Restore the objects in the regions in the collection set after an |
| 805 | // evacuation failure. |
| 806 | void restore_after_evac_failure(); |
| 807 | |
| 808 | PreservedMarksSet _preserved_marks_set; |
| 809 | |
| 810 | // Preserve the mark of "obj", if necessary, in preparation for its mark |
| 811 | // word being overwritten with a self-forwarding-pointer. |
| 812 | void preserve_mark_during_evac_failure(uint worker_id, oop obj, markOop m); |
| 813 | |
| 814 | #ifndef PRODUCT |
| 815 | // Support for forcing evacuation failures. Analogous to |
| 816 | // PromotionFailureALot for the other collectors. |
| 817 | |
| 818 | // Records whether G1EvacuationFailureALot should be in effect |
| 819 | // for the current GC |
| 820 | bool _evacuation_failure_alot_for_current_gc; |
| 821 | |
| 822 | // Used to record the GC number for interval checking when |
| 823 | // determining whether G1EvaucationFailureALot is in effect |
| 824 | // for the current GC. |
| 825 | size_t _evacuation_failure_alot_gc_number; |
| 826 | |
| 827 | // Count of the number of evacuations between failures. |
| 828 | volatile size_t _evacuation_failure_alot_count; |
| 829 | |
| 830 | // Set whether G1EvacuationFailureALot should be in effect |
| 831 | // for the current GC (based upon the type of GC and which |
| 832 | // command line flags are set); |
| 833 | inline bool evacuation_failure_alot_for_gc_type(bool for_young_gc, |
| 834 | bool during_initial_mark, |
| 835 | bool mark_or_rebuild_in_progress); |
| 836 | |
| 837 | inline void set_evacuation_failure_alot_for_current_gc(); |
| 838 | |
| 839 | // Return true if it's time to cause an evacuation failure. |
| 840 | inline bool evacuation_should_fail(); |
| 841 | |
| 842 | // Reset the G1EvacuationFailureALot counters. Should be called at |
| 843 | // the end of an evacuation pause in which an evacuation failure occurred. |
| 844 | inline void reset_evacuation_should_fail(); |
| 845 | #endif // !PRODUCT |
| 846 | |
| 847 | // ("Weak") Reference processing support. |
| 848 | // |
| 849 | // G1 has 2 instances of the reference processor class. One |
| 850 | // (_ref_processor_cm) handles reference object discovery |
| 851 | // and subsequent processing during concurrent marking cycles. |
| 852 | // |
| 853 | // The other (_ref_processor_stw) handles reference object |
| 854 | // discovery and processing during full GCs and incremental |
| 855 | // evacuation pauses. |
| 856 | // |
| 857 | // During an incremental pause, reference discovery will be |
| 858 | // temporarily disabled for _ref_processor_cm and will be |
| 859 | // enabled for _ref_processor_stw. At the end of the evacuation |
| 860 | // pause references discovered by _ref_processor_stw will be |
| 861 | // processed and discovery will be disabled. The previous |
| 862 | // setting for reference object discovery for _ref_processor_cm |
| 863 | // will be re-instated. |
| 864 | // |
| 865 | // At the start of marking: |
| 866 | // * Discovery by the CM ref processor is verified to be inactive |
| 867 | // and it's discovered lists are empty. |
| 868 | // * Discovery by the CM ref processor is then enabled. |
| 869 | // |
| 870 | // At the end of marking: |
| 871 | // * Any references on the CM ref processor's discovered |
| 872 | // lists are processed (possibly MT). |
| 873 | // |
| 874 | // At the start of full GC we: |
| 875 | // * Disable discovery by the CM ref processor and |
| 876 | // empty CM ref processor's discovered lists |
| 877 | // (without processing any entries). |
| 878 | // * Verify that the STW ref processor is inactive and it's |
| 879 | // discovered lists are empty. |
| 880 | // * Temporarily set STW ref processor discovery as single threaded. |
| 881 | // * Temporarily clear the STW ref processor's _is_alive_non_header |
| 882 | // field. |
| 883 | // * Finally enable discovery by the STW ref processor. |
| 884 | // |
| 885 | // The STW ref processor is used to record any discovered |
| 886 | // references during the full GC. |
| 887 | // |
| 888 | // At the end of a full GC we: |
| 889 | // * Enqueue any reference objects discovered by the STW ref processor |
| 890 | // that have non-live referents. This has the side-effect of |
| 891 | // making the STW ref processor inactive by disabling discovery. |
| 892 | // * Verify that the CM ref processor is still inactive |
| 893 | // and no references have been placed on it's discovered |
| 894 | // lists (also checked as a precondition during initial marking). |
| 895 | |
| 896 | // The (stw) reference processor... |
| 897 | ReferenceProcessor* _ref_processor_stw; |
| 898 | |
| 899 | // During reference object discovery, the _is_alive_non_header |
| 900 | // closure (if non-null) is applied to the referent object to |
| 901 | // determine whether the referent is live. If so then the |
| 902 | // reference object does not need to be 'discovered' and can |
| 903 | // be treated as a regular oop. This has the benefit of reducing |
| 904 | // the number of 'discovered' reference objects that need to |
| 905 | // be processed. |
| 906 | // |
| 907 | // Instance of the is_alive closure for embedding into the |
| 908 | // STW reference processor as the _is_alive_non_header field. |
| 909 | // Supplying a value for the _is_alive_non_header field is |
| 910 | // optional but doing so prevents unnecessary additions to |
| 911 | // the discovered lists during reference discovery. |
| 912 | G1STWIsAliveClosure _is_alive_closure_stw; |
| 913 | |
| 914 | G1STWSubjectToDiscoveryClosure _is_subject_to_discovery_stw; |
| 915 | |
| 916 | // The (concurrent marking) reference processor... |
| 917 | ReferenceProcessor* _ref_processor_cm; |
| 918 | |
| 919 | // Instance of the concurrent mark is_alive closure for embedding |
| 920 | // into the Concurrent Marking reference processor as the |
| 921 | // _is_alive_non_header field. Supplying a value for the |
| 922 | // _is_alive_non_header field is optional but doing so prevents |
| 923 | // unnecessary additions to the discovered lists during reference |
| 924 | // discovery. |
| 925 | G1CMIsAliveClosure _is_alive_closure_cm; |
| 926 | |
| 927 | G1CMSubjectToDiscoveryClosure _is_subject_to_discovery_cm; |
| 928 | public: |
| 929 | |
| 930 | RefToScanQueue *task_queue(uint i) const; |
| 931 | |
| 932 | uint num_task_queues() const; |
| 933 | |
| 934 | // A set of cards where updates happened during the GC |
| 935 | G1DirtyCardQueueSet& dirty_card_queue_set() { return _dirty_card_queue_set; } |
| 936 | |
| 937 | // Create a G1CollectedHeap. |
| 938 | // Must call the initialize method afterwards. |
| 939 | // May not return if something goes wrong. |
| 940 | G1CollectedHeap(); |
| 941 | |
| 942 | private: |
| 943 | jint initialize_concurrent_refinement(); |
| 944 | jint initialize_young_gen_sampling_thread(); |
| 945 | public: |
| 946 | // Initialize the G1CollectedHeap to have the initial and |
| 947 | // maximum sizes and remembered and barrier sets |
| 948 | // specified by the policy object. |
| 949 | jint initialize(); |
| 950 | |
| 951 | virtual void stop(); |
| 952 | virtual void safepoint_synchronize_begin(); |
| 953 | virtual void safepoint_synchronize_end(); |
| 954 | |
| 955 | // Does operations required after initialization has been done. |
| 956 | void post_initialize(); |
| 957 | |
| 958 | // Initialize weak reference processing. |
| 959 | void ref_processing_init(); |
| 960 | |
| 961 | virtual Name kind() const { |
| 962 | return CollectedHeap::G1; |
| 963 | } |
| 964 | |
| 965 | virtual const char* name() const { |
| 966 | return "G1" ; |
| 967 | } |
| 968 | |
| 969 | const G1CollectorState* collector_state() const { return &_collector_state; } |
| 970 | G1CollectorState* collector_state() { return &_collector_state; } |
| 971 | |
| 972 | // The current policy object for the collector. |
| 973 | G1Policy* policy() const { return _policy; } |
| 974 | // The remembered set. |
| 975 | G1RemSet* rem_set() const { return _rem_set; } |
| 976 | |
| 977 | inline G1GCPhaseTimes* phase_times() const; |
| 978 | |
| 979 | HeapRegionManager* hrm() const { return _hrm; } |
| 980 | |
| 981 | const G1CollectionSet* collection_set() const { return &_collection_set; } |
| 982 | G1CollectionSet* collection_set() { return &_collection_set; } |
| 983 | |
| 984 | virtual SoftRefPolicy* soft_ref_policy(); |
| 985 | |
| 986 | virtual void initialize_serviceability(); |
| 987 | virtual MemoryUsage memory_usage(); |
| 988 | virtual GrowableArray<GCMemoryManager*> memory_managers(); |
| 989 | virtual GrowableArray<MemoryPool*> memory_pools(); |
| 990 | |
| 991 | // Try to minimize the remembered set. |
| 992 | void scrub_rem_set(); |
| 993 | |
| 994 | // Apply the given closure on all cards in the Hot Card Cache, emptying it. |
| 995 | void iterate_hcc_closure(G1CardTableEntryClosure* cl, uint worker_i); |
| 996 | |
| 997 | // Apply the given closure on all cards in the Dirty Card Queue Set, emptying it. |
| 998 | void iterate_dirty_card_closure(G1CardTableEntryClosure* cl, uint worker_i); |
| 999 | |
| 1000 | // The shared block offset table array. |
| 1001 | G1BlockOffsetTable* bot() const { return _bot; } |
| 1002 | |
| 1003 | // Reference Processing accessors |
| 1004 | |
| 1005 | // The STW reference processor.... |
| 1006 | ReferenceProcessor* ref_processor_stw() const { return _ref_processor_stw; } |
| 1007 | |
| 1008 | G1NewTracer* gc_tracer_stw() const { return _gc_tracer_stw; } |
| 1009 | |
| 1010 | // The Concurrent Marking reference processor... |
| 1011 | ReferenceProcessor* ref_processor_cm() const { return _ref_processor_cm; } |
| 1012 | |
| 1013 | size_t unused_committed_regions_in_bytes() const; |
| 1014 | |
| 1015 | virtual size_t capacity() const; |
| 1016 | virtual size_t used() const; |
| 1017 | // This should be called when we're not holding the heap lock. The |
| 1018 | // result might be a bit inaccurate. |
| 1019 | size_t used_unlocked() const; |
| 1020 | size_t recalculate_used() const; |
| 1021 | |
| 1022 | // These virtual functions do the actual allocation. |
| 1023 | // Some heaps may offer a contiguous region for shared non-blocking |
| 1024 | // allocation, via inlined code (by exporting the address of the top and |
| 1025 | // end fields defining the extent of the contiguous allocation region.) |
| 1026 | // But G1CollectedHeap doesn't yet support this. |
| 1027 | |
| 1028 | virtual bool is_maximal_no_gc() const { |
| 1029 | return _hrm->available() == 0; |
| 1030 | } |
| 1031 | |
| 1032 | // Returns whether there are any regions left in the heap for allocation. |
| 1033 | bool has_regions_left_for_allocation() const { |
| 1034 | return !is_maximal_no_gc() || num_free_regions() != 0; |
| 1035 | } |
| 1036 | |
| 1037 | // The current number of regions in the heap. |
| 1038 | uint num_regions() const { return _hrm->length(); } |
| 1039 | |
| 1040 | // The max number of regions in the heap. |
| 1041 | uint max_regions() const { return _hrm->max_length(); } |
| 1042 | |
| 1043 | // Max number of regions that can be comitted. |
| 1044 | uint max_expandable_regions() const { return _hrm->max_expandable_length(); } |
| 1045 | |
| 1046 | // The number of regions that are completely free. |
| 1047 | uint num_free_regions() const { return _hrm->num_free_regions(); } |
| 1048 | |
| 1049 | // The number of regions that can be allocated into. |
| 1050 | uint num_free_or_available_regions() const { return num_free_regions() + _hrm->available(); } |
| 1051 | |
| 1052 | MemoryUsage get_auxiliary_data_memory_usage() const { |
| 1053 | return _hrm->get_auxiliary_data_memory_usage(); |
| 1054 | } |
| 1055 | |
| 1056 | // The number of regions that are not completely free. |
| 1057 | uint num_used_regions() const { return num_regions() - num_free_regions(); } |
| 1058 | |
| 1059 | #ifdef ASSERT |
| 1060 | bool is_on_master_free_list(HeapRegion* hr) { |
| 1061 | return _hrm->is_free(hr); |
| 1062 | } |
| 1063 | #endif // ASSERT |
| 1064 | |
| 1065 | inline void old_set_add(HeapRegion* hr); |
| 1066 | inline void old_set_remove(HeapRegion* hr); |
| 1067 | |
| 1068 | inline void archive_set_add(HeapRegion* hr); |
| 1069 | |
| 1070 | size_t non_young_capacity_bytes() { |
| 1071 | return (old_regions_count() + _archive_set.length() + humongous_regions_count()) * HeapRegion::GrainBytes; |
| 1072 | } |
| 1073 | |
| 1074 | // Determine whether the given region is one that we are using as an |
| 1075 | // old GC alloc region. |
| 1076 | bool is_old_gc_alloc_region(HeapRegion* hr); |
| 1077 | |
| 1078 | // Perform a collection of the heap; intended for use in implementing |
| 1079 | // "System.gc". This probably implies as full a collection as the |
| 1080 | // "CollectedHeap" supports. |
| 1081 | virtual void collect(GCCause::Cause cause); |
| 1082 | |
| 1083 | // Perform a collection of the heap with the given cause; if the VM operation |
| 1084 | // fails to execute for any reason, retry only if retry_on_gc_failure is set. |
| 1085 | // Returns whether this collection actually executed. |
| 1086 | bool try_collect(GCCause::Cause cause, bool retry_on_gc_failure); |
| 1087 | |
| 1088 | // True iff an evacuation has failed in the most-recent collection. |
| 1089 | bool evacuation_failed() { return _evacuation_failed; } |
| 1090 | |
| 1091 | void remove_from_old_sets(const uint old_regions_removed, const uint humongous_regions_removed); |
| 1092 | void prepend_to_freelist(FreeRegionList* list); |
| 1093 | void decrement_summary_bytes(size_t bytes); |
| 1094 | |
| 1095 | virtual bool is_in(const void* p) const; |
| 1096 | #ifdef ASSERT |
| 1097 | // Returns whether p is in one of the available areas of the heap. Slow but |
| 1098 | // extensive version. |
| 1099 | bool is_in_exact(const void* p) const; |
| 1100 | #endif |
| 1101 | |
| 1102 | // Return "TRUE" iff the given object address is within the collection |
| 1103 | // set. Assumes that the reference points into the heap. |
| 1104 | inline bool is_in_cset(const HeapRegion *hr); |
| 1105 | inline bool is_in_cset(oop obj); |
| 1106 | inline bool is_in_cset(HeapWord* addr); |
| 1107 | |
| 1108 | inline bool is_in_cset_or_humongous(const oop obj); |
| 1109 | |
| 1110 | private: |
| 1111 | // This array is used for a quick test on whether a reference points into |
| 1112 | // the collection set or not. Each of the array's elements denotes whether the |
| 1113 | // corresponding region is in the collection set or not. |
| 1114 | G1HeapRegionAttrBiasedMappedArray _region_attr; |
| 1115 | |
| 1116 | public: |
| 1117 | |
| 1118 | inline G1HeapRegionAttr region_attr(const void* obj); |
| 1119 | |
| 1120 | // Return "TRUE" iff the given object address is in the reserved |
| 1121 | // region of g1. |
| 1122 | bool is_in_g1_reserved(const void* p) const { |
| 1123 | return _hrm->reserved().contains(p); |
| 1124 | } |
| 1125 | |
| 1126 | // Returns a MemRegion that corresponds to the space that has been |
| 1127 | // reserved for the heap |
| 1128 | MemRegion g1_reserved() const { |
| 1129 | return _hrm->reserved(); |
| 1130 | } |
| 1131 | |
| 1132 | G1HotCardCache* g1_hot_card_cache() const { return _hot_card_cache; } |
| 1133 | |
| 1134 | G1CardTable* card_table() const { |
| 1135 | return _card_table; |
| 1136 | } |
| 1137 | |
| 1138 | // Iteration functions. |
| 1139 | |
| 1140 | // Iterate over all objects, calling "cl.do_object" on each. |
| 1141 | virtual void object_iterate(ObjectClosure* cl); |
| 1142 | |
| 1143 | virtual void safe_object_iterate(ObjectClosure* cl) { |
| 1144 | object_iterate(cl); |
| 1145 | } |
| 1146 | |
| 1147 | // Iterate over heap regions, in address order, terminating the |
| 1148 | // iteration early if the "do_heap_region" method returns "true". |
| 1149 | void heap_region_iterate(HeapRegionClosure* blk) const; |
| 1150 | |
| 1151 | // Return the region with the given index. It assumes the index is valid. |
| 1152 | inline HeapRegion* region_at(uint index) const; |
| 1153 | inline HeapRegion* region_at_or_null(uint index) const; |
| 1154 | |
| 1155 | // Return the next region (by index) that is part of the same |
| 1156 | // humongous object that hr is part of. |
| 1157 | inline HeapRegion* next_region_in_humongous(HeapRegion* hr) const; |
| 1158 | |
| 1159 | // Calculate the region index of the given address. Given address must be |
| 1160 | // within the heap. |
| 1161 | inline uint addr_to_region(HeapWord* addr) const; |
| 1162 | |
| 1163 | inline HeapWord* bottom_addr_for_region(uint index) const; |
| 1164 | |
| 1165 | // Two functions to iterate over the heap regions in parallel. Threads |
| 1166 | // compete using the HeapRegionClaimer to claim the regions before |
| 1167 | // applying the closure on them. |
| 1168 | // The _from_worker_offset version uses the HeapRegionClaimer and |
| 1169 | // the worker id to calculate a start offset to prevent all workers to |
| 1170 | // start from the point. |
| 1171 | void heap_region_par_iterate_from_worker_offset(HeapRegionClosure* cl, |
| 1172 | HeapRegionClaimer* hrclaimer, |
| 1173 | uint worker_id) const; |
| 1174 | |
| 1175 | void heap_region_par_iterate_from_start(HeapRegionClosure* cl, |
| 1176 | HeapRegionClaimer* hrclaimer) const; |
| 1177 | |
| 1178 | // Iterate over all regions currently in the current collection set. |
| 1179 | void collection_set_iterate_all(HeapRegionClosure* blk); |
| 1180 | |
| 1181 | // Iterate over the regions in the current increment of the collection set. |
| 1182 | // Starts the iteration so that the start regions of a given worker id over the |
| 1183 | // set active_workers are evenly spread across the set of collection set regions |
| 1184 | // to be iterated. |
| 1185 | void collection_set_iterate_increment_from(HeapRegionClosure *blk, uint worker_id); |
| 1186 | |
| 1187 | // Returns the HeapRegion that contains addr. addr must not be NULL. |
| 1188 | template <class T> |
| 1189 | inline HeapRegion* heap_region_containing(const T addr) const; |
| 1190 | |
| 1191 | // Returns the HeapRegion that contains addr, or NULL if that is an uncommitted |
| 1192 | // region. addr must not be NULL. |
| 1193 | template <class T> |
| 1194 | inline HeapRegion* heap_region_containing_or_null(const T addr) const; |
| 1195 | |
| 1196 | // A CollectedHeap is divided into a dense sequence of "blocks"; that is, |
| 1197 | // each address in the (reserved) heap is a member of exactly |
| 1198 | // one block. The defining characteristic of a block is that it is |
| 1199 | // possible to find its size, and thus to progress forward to the next |
| 1200 | // block. (Blocks may be of different sizes.) Thus, blocks may |
| 1201 | // represent Java objects, or they might be free blocks in a |
| 1202 | // free-list-based heap (or subheap), as long as the two kinds are |
| 1203 | // distinguishable and the size of each is determinable. |
| 1204 | |
| 1205 | // Returns the address of the start of the "block" that contains the |
| 1206 | // address "addr". We say "blocks" instead of "object" since some heaps |
| 1207 | // may not pack objects densely; a chunk may either be an object or a |
| 1208 | // non-object. |
| 1209 | virtual HeapWord* block_start(const void* addr) const; |
| 1210 | |
| 1211 | // Requires "addr" to be the start of a block, and returns "TRUE" iff |
| 1212 | // the block is an object. |
| 1213 | virtual bool block_is_obj(const HeapWord* addr) const; |
| 1214 | |
| 1215 | // Section on thread-local allocation buffers (TLABs) |
| 1216 | // See CollectedHeap for semantics. |
| 1217 | |
| 1218 | bool supports_tlab_allocation() const; |
| 1219 | size_t tlab_capacity(Thread* ignored) const; |
| 1220 | size_t tlab_used(Thread* ignored) const; |
| 1221 | size_t max_tlab_size() const; |
| 1222 | size_t unsafe_max_tlab_alloc(Thread* ignored) const; |
| 1223 | |
| 1224 | inline bool is_in_young(const oop obj); |
| 1225 | |
| 1226 | // Returns "true" iff the given word_size is "very large". |
| 1227 | static bool is_humongous(size_t word_size) { |
| 1228 | // Note this has to be strictly greater-than as the TLABs |
| 1229 | // are capped at the humongous threshold and we want to |
| 1230 | // ensure that we don't try to allocate a TLAB as |
| 1231 | // humongous and that we don't allocate a humongous |
| 1232 | // object in a TLAB. |
| 1233 | return word_size > _humongous_object_threshold_in_words; |
| 1234 | } |
| 1235 | |
| 1236 | // Returns the humongous threshold for a specific region size |
| 1237 | static size_t humongous_threshold_for(size_t region_size) { |
| 1238 | return (region_size / 2); |
| 1239 | } |
| 1240 | |
| 1241 | // Returns the number of regions the humongous object of the given word size |
| 1242 | // requires. |
| 1243 | static size_t humongous_obj_size_in_regions(size_t word_size); |
| 1244 | |
| 1245 | // Print the maximum heap capacity. |
| 1246 | virtual size_t max_capacity() const; |
| 1247 | |
| 1248 | // Return the size of reserved memory. Returns different value than max_capacity() when AllocateOldGenAt is used. |
| 1249 | virtual size_t max_reserved_capacity() const; |
| 1250 | |
| 1251 | virtual jlong millis_since_last_gc(); |
| 1252 | |
| 1253 | |
| 1254 | // Convenience function to be used in situations where the heap type can be |
| 1255 | // asserted to be this type. |
| 1256 | static G1CollectedHeap* heap(); |
| 1257 | |
| 1258 | void set_region_short_lived_locked(HeapRegion* hr); |
| 1259 | // add appropriate methods for any other surv rate groups |
| 1260 | |
| 1261 | const G1SurvivorRegions* survivor() const { return &_survivor; } |
| 1262 | |
| 1263 | uint eden_regions_count() const { return _eden.length(); } |
| 1264 | uint survivor_regions_count() const { return _survivor.length(); } |
| 1265 | size_t eden_regions_used_bytes() const { return _eden.used_bytes(); } |
| 1266 | size_t survivor_regions_used_bytes() const { return _survivor.used_bytes(); } |
| 1267 | uint young_regions_count() const { return _eden.length() + _survivor.length(); } |
| 1268 | uint old_regions_count() const { return _old_set.length(); } |
| 1269 | uint archive_regions_count() const { return _archive_set.length(); } |
| 1270 | uint humongous_regions_count() const { return _humongous_set.length(); } |
| 1271 | |
| 1272 | #ifdef ASSERT |
| 1273 | bool check_young_list_empty(); |
| 1274 | #endif |
| 1275 | |
| 1276 | // *** Stuff related to concurrent marking. It's not clear to me that so |
| 1277 | // many of these need to be public. |
| 1278 | |
| 1279 | // The functions below are helper functions that a subclass of |
| 1280 | // "CollectedHeap" can use in the implementation of its virtual |
| 1281 | // functions. |
| 1282 | // This performs a concurrent marking of the live objects in a |
| 1283 | // bitmap off to the side. |
| 1284 | void do_concurrent_mark(); |
| 1285 | |
| 1286 | bool is_marked_next(oop obj) const; |
| 1287 | |
| 1288 | // Determine if an object is dead, given the object and also |
| 1289 | // the region to which the object belongs. An object is dead |
| 1290 | // iff a) it was not allocated since the last mark, b) it |
| 1291 | // is not marked, and c) it is not in an archive region. |
| 1292 | bool is_obj_dead(const oop obj, const HeapRegion* hr) const { |
| 1293 | return |
| 1294 | hr->is_obj_dead(obj, _cm->prev_mark_bitmap()) && |
| 1295 | !hr->is_archive(); |
| 1296 | } |
| 1297 | |
| 1298 | // This function returns true when an object has been |
| 1299 | // around since the previous marking and hasn't yet |
| 1300 | // been marked during this marking, and is not in an archive region. |
| 1301 | bool is_obj_ill(const oop obj, const HeapRegion* hr) const { |
| 1302 | return |
| 1303 | !hr->obj_allocated_since_next_marking(obj) && |
| 1304 | !is_marked_next(obj) && |
| 1305 | !hr->is_archive(); |
| 1306 | } |
| 1307 | |
| 1308 | // Determine if an object is dead, given only the object itself. |
| 1309 | // This will find the region to which the object belongs and |
| 1310 | // then call the region version of the same function. |
| 1311 | |
| 1312 | // Added if it is NULL it isn't dead. |
| 1313 | |
| 1314 | inline bool is_obj_dead(const oop obj) const; |
| 1315 | |
| 1316 | inline bool is_obj_ill(const oop obj) const; |
| 1317 | |
| 1318 | inline bool is_obj_dead_full(const oop obj, const HeapRegion* hr) const; |
| 1319 | inline bool is_obj_dead_full(const oop obj) const; |
| 1320 | |
| 1321 | G1ConcurrentMark* concurrent_mark() const { return _cm; } |
| 1322 | |
| 1323 | // Refinement |
| 1324 | |
| 1325 | G1ConcurrentRefine* concurrent_refine() const { return _cr; } |
| 1326 | |
| 1327 | // Optimized nmethod scanning support routines |
| 1328 | |
| 1329 | // Register the given nmethod with the G1 heap. |
| 1330 | virtual void register_nmethod(nmethod* nm); |
| 1331 | |
| 1332 | // Unregister the given nmethod from the G1 heap. |
| 1333 | virtual void unregister_nmethod(nmethod* nm); |
| 1334 | |
| 1335 | // No nmethod flushing needed. |
| 1336 | virtual void flush_nmethod(nmethod* nm) {} |
| 1337 | |
| 1338 | // No nmethod verification implemented. |
| 1339 | virtual void verify_nmethod(nmethod* nm) {} |
| 1340 | |
| 1341 | // Free up superfluous code root memory. |
| 1342 | void purge_code_root_memory(); |
| 1343 | |
| 1344 | // Rebuild the strong code root lists for each region |
| 1345 | // after a full GC. |
| 1346 | void rebuild_strong_code_roots(); |
| 1347 | |
| 1348 | // Partial cleaning of VM internal data structures. |
| 1349 | void string_dedup_cleaning(BoolObjectClosure* is_alive, |
| 1350 | OopClosure* keep_alive, |
| 1351 | G1GCPhaseTimes* phase_times = NULL); |
| 1352 | |
| 1353 | // Performs cleaning of data structures after class unloading. |
| 1354 | void complete_cleaning(BoolObjectClosure* is_alive, bool class_unloading_occurred); |
| 1355 | |
| 1356 | // Redirty logged cards in the refinement queue. |
| 1357 | void redirty_logged_cards(); |
| 1358 | // Verification |
| 1359 | |
| 1360 | // Deduplicate the string |
| 1361 | virtual void deduplicate_string(oop str); |
| 1362 | |
| 1363 | // Perform any cleanup actions necessary before allowing a verification. |
| 1364 | virtual void prepare_for_verify(); |
| 1365 | |
| 1366 | // Perform verification. |
| 1367 | |
| 1368 | // vo == UsePrevMarking -> use "prev" marking information, |
| 1369 | // vo == UseNextMarking -> use "next" marking information |
| 1370 | // vo == UseFullMarking -> use "next" marking bitmap but no TAMS |
| 1371 | // |
| 1372 | // NOTE: Only the "prev" marking information is guaranteed to be |
| 1373 | // consistent most of the time, so most calls to this should use |
| 1374 | // vo == UsePrevMarking. |
| 1375 | // Currently, there is only one case where this is called with |
| 1376 | // vo == UseNextMarking, which is to verify the "next" marking |
| 1377 | // information at the end of remark. |
| 1378 | // Currently there is only one place where this is called with |
| 1379 | // vo == UseFullMarking, which is to verify the marking during a |
| 1380 | // full GC. |
| 1381 | void verify(VerifyOption vo); |
| 1382 | |
| 1383 | // WhiteBox testing support. |
| 1384 | virtual bool supports_concurrent_phase_control() const; |
| 1385 | virtual bool request_concurrent_phase(const char* phase); |
| 1386 | bool is_heterogeneous_heap() const; |
| 1387 | |
| 1388 | virtual WorkGang* get_safepoint_workers() { return _workers; } |
| 1389 | |
| 1390 | // The methods below are here for convenience and dispatch the |
| 1391 | // appropriate method depending on value of the given VerifyOption |
| 1392 | // parameter. The values for that parameter, and their meanings, |
| 1393 | // are the same as those above. |
| 1394 | |
| 1395 | bool is_obj_dead_cond(const oop obj, |
| 1396 | const HeapRegion* hr, |
| 1397 | const VerifyOption vo) const; |
| 1398 | |
| 1399 | bool is_obj_dead_cond(const oop obj, |
| 1400 | const VerifyOption vo) const; |
| 1401 | |
| 1402 | G1HeapSummary create_g1_heap_summary(); |
| 1403 | G1EvacSummary create_g1_evac_summary(G1EvacStats* stats); |
| 1404 | |
| 1405 | // Printing |
| 1406 | private: |
| 1407 | void print_heap_regions() const; |
| 1408 | void print_regions_on(outputStream* st) const; |
| 1409 | |
| 1410 | public: |
| 1411 | virtual void print_on(outputStream* st) const; |
| 1412 | virtual void print_extended_on(outputStream* st) const; |
| 1413 | virtual void print_on_error(outputStream* st) const; |
| 1414 | |
| 1415 | virtual void print_gc_threads_on(outputStream* st) const; |
| 1416 | virtual void gc_threads_do(ThreadClosure* tc) const; |
| 1417 | |
| 1418 | // Override |
| 1419 | void print_tracing_info() const; |
| 1420 | |
| 1421 | // The following two methods are helpful for debugging RSet issues. |
| 1422 | void print_cset_rsets() PRODUCT_RETURN; |
| 1423 | void print_all_rsets() PRODUCT_RETURN; |
| 1424 | |
| 1425 | size_t pending_card_num(); |
| 1426 | }; |
| 1427 | |
| 1428 | class G1ParEvacuateFollowersClosure : public VoidClosure { |
| 1429 | private: |
| 1430 | double _start_term; |
| 1431 | double _term_time; |
| 1432 | size_t _term_attempts; |
| 1433 | |
| 1434 | void start_term_time() { _term_attempts++; _start_term = os::elapsedTime(); } |
| 1435 | void end_term_time() { _term_time += (os::elapsedTime() - _start_term); } |
| 1436 | protected: |
| 1437 | G1CollectedHeap* _g1h; |
| 1438 | G1ParScanThreadState* _par_scan_state; |
| 1439 | RefToScanQueueSet* _queues; |
| 1440 | ParallelTaskTerminator* _terminator; |
| 1441 | G1GCPhaseTimes::GCParPhases _phase; |
| 1442 | |
| 1443 | G1ParScanThreadState* par_scan_state() { return _par_scan_state; } |
| 1444 | RefToScanQueueSet* queues() { return _queues; } |
| 1445 | ParallelTaskTerminator* terminator() { return _terminator; } |
| 1446 | |
| 1447 | public: |
| 1448 | G1ParEvacuateFollowersClosure(G1CollectedHeap* g1h, |
| 1449 | G1ParScanThreadState* par_scan_state, |
| 1450 | RefToScanQueueSet* queues, |
| 1451 | ParallelTaskTerminator* terminator, |
| 1452 | G1GCPhaseTimes::GCParPhases phase) |
| 1453 | : _start_term(0.0), _term_time(0.0), _term_attempts(0), |
| 1454 | _g1h(g1h), _par_scan_state(par_scan_state), |
| 1455 | _queues(queues), _terminator(terminator), _phase(phase) {} |
| 1456 | |
| 1457 | void do_void(); |
| 1458 | |
| 1459 | double term_time() const { return _term_time; } |
| 1460 | size_t term_attempts() const { return _term_attempts; } |
| 1461 | |
| 1462 | private: |
| 1463 | inline bool offer_termination(); |
| 1464 | }; |
| 1465 | |
| 1466 | #endif // SHARE_GC_G1_G1COLLECTEDHEAP_HPP |
| 1467 | |