| 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 |  | 
|---|