1 /* 2 * Copyright (c) 2013, 2017, Red Hat, Inc. and/or its affiliates. 3 * 4 * This code is free software; you can redistribute it and/or modify it 5 * under the terms of the GNU General Public License version 2 only, as 6 * published by the Free Software Foundation. 7 * 8 * This code is distributed in the hope that it will be useful, but WITHOUT 9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 11 * version 2 for more details (a copy is included in the LICENSE file that 12 * accompanied this code). 13 * 14 * You should have received a copy of the GNU General Public License version 15 * 2 along with this work; if not, write to the Free Software Foundation, 16 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 17 * 18 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 19 * or visit www.oracle.com if you need additional information or have any 20 * questions. 21 * 22 */ 23 24 #ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHHEAP_HPP 25 #define SHARE_VM_GC_SHENANDOAH_SHENANDOAHHEAP_HPP 26 27 #include "gc/shared/markBitMap.hpp" 28 #include "gc/shenandoah/shenandoahHeapLock.hpp" 29 #include "gc/shenandoah/shenandoahSharedVariables.hpp" 30 #include "gc/shenandoah/shenandoahWorkGroup.hpp" 31 #include "services/memoryManager.hpp" 32 33 class ConcurrentGCTimer; 34 class ShenandoahAsserts; 35 class ShenandoahAllocTracker; 36 class ShenandoahCollectorPolicy; 37 class ShenandoahConnectionMatrix; 38 class ShenandoahPhaseTimings; 39 class ShenandoahHeap; 40 class ShenandoahHeapRegion; 41 class ShenandoahHeapRegionClosure; 42 class ShenandoahHeapRegionSet; 43 class ShenandoahCollectionSet; 44 class ShenandoahFreeSet; 45 class ShenandoahConcurrentMark; 46 class ShenandoahMarkCompact; 47 class ShenandoahPartialGC; 48 class ShenandoahTraversalGC; 49 class ShenandoahVerifier; 50 class ShenandoahConcurrentThread; 51 class ShenandoahMonitoringSupport; 52 53 class ShenandoahUpdateRefsClosure: public OopClosure { 54 private: 55 ShenandoahHeap* _heap; 56 57 template <class T> 58 inline void do_oop_work(T* p); 59 60 public: 61 ShenandoahUpdateRefsClosure(); 62 inline void do_oop(oop* p); 63 inline void do_oop(narrowOop* p); 64 }; 65 66 #ifdef ASSERT 67 class ShenandoahAssertToSpaceClosure : public OopClosure { 68 private: 69 template <class T> 70 void do_oop_nv(T* p); 71 public: 72 void do_oop(narrowOop* p); 73 void do_oop(oop* p); 74 }; 75 #endif 76 77 class ShenandoahAlwaysTrueClosure : public BoolObjectClosure { 78 public: 79 bool do_object_b(oop p) { return true; } 80 }; 81 82 class ShenandoahForwardedIsAliveClosure: public BoolObjectClosure { 83 private: 84 ShenandoahHeap* _heap; 85 public: 86 ShenandoahForwardedIsAliveClosure(); 87 void init(ShenandoahHeap* heap) { 88 _heap = heap; 89 } 90 bool do_object_b(oop obj); 91 }; 92 93 class ShenandoahIsAliveClosure: public BoolObjectClosure { 94 private: 95 ShenandoahHeap* _heap; 96 public: 97 ShenandoahIsAliveClosure(); 98 void init(ShenandoahHeap* heap) { 99 _heap = heap; 100 } 101 bool do_object_b(oop obj); 102 }; 103 104 class VMStructs; 105 106 // // A "ShenandoahHeap" is an implementation of a java heap for HotSpot. 107 // // It uses a new pauseless GC algorithm based on Brooks pointers. 108 // // Derived from G1 109 110 // // 111 // // CollectedHeap 112 // // SharedHeap 113 // // ShenandoahHeap 114 class ShenandoahHeap : public CollectedHeap { 115 friend class ShenandoahAsserts; 116 friend class VMStructs; 117 118 enum CancelState { 119 120 // Normal state. GC has not been cancelled and is open for cancellation. 121 // Worker threads can suspend for safepoint. 122 CANCELLABLE, 123 124 // GC has been cancelled. Worker threads can not suspend for 125 // safepoint but must finish their work as soon as possible. 126 CANCELLED, 127 128 // GC has not been cancelled and must not be cancelled. At least 129 // one worker thread checks for pending safepoint and may suspend 130 // if a safepoint is pending. 131 NOT_CANCELLED 132 133 }; 134 135 public: 136 // GC state describes the important parts of collector state, that may be 137 // used to make barrier selection decisions in the native and generated code. 138 // Multiple bits can be set at once. 139 // 140 // Important invariant: when GC state is zero, the heap is stable, and no barriers 141 // are required. 142 enum GCStateBitPos { 143 // Heap has forwarded objects: need RB, ACMP, CAS barriers. 144 HAS_FORWARDED_BITPOS = 0, 145 146 // Heap is under marking: needs SATB barriers. 147 MARKING_BITPOS = 1, 148 149 // Heap is under evacuation: needs WB barriers. (Set together with UNSTABLE) 150 EVACUATION_BITPOS = 2, 151 152 // Heap is under updating: needs SVRB/SVWB barriers. 153 UPDATEREFS_BITPOS = 3, 154 155 // Heap is under partial collection 156 PARTIAL_BITPOS = 4, 157 158 // Heap is under traversal collection 159 TRAVERSAL_BITPOS = 5, 160 }; 161 162 enum GCState { 163 STABLE = 0, 164 HAS_FORWARDED = 1 << HAS_FORWARDED_BITPOS, 165 MARKING = 1 << MARKING_BITPOS, 166 EVACUATION = 1 << EVACUATION_BITPOS, 167 UPDATEREFS = 1 << UPDATEREFS_BITPOS, 168 PARTIAL = 1 << PARTIAL_BITPOS, 169 TRAVERSAL = 1 << TRAVERSAL_BITPOS, 170 }; 171 172 enum ShenandoahDegenerationPoint { 173 _degenerated_partial, 174 _degenerated_traversal, 175 _degenerated_outside_cycle, 176 _degenerated_mark, 177 _degenerated_evac, 178 _degenerated_updaterefs, 179 }; 180 181 static const char* degen_point_to_string(ShenandoahDegenerationPoint point) { 182 switch (point) { 183 case _degenerated_partial: 184 return "Partial"; 185 case _degenerated_traversal: 186 return "Traversal"; 187 case _degenerated_outside_cycle: 188 return "Outside of Cycle"; 189 case _degenerated_mark: 190 return "Mark"; 191 case _degenerated_evac: 192 return "Evacuation"; 193 case _degenerated_updaterefs: 194 return "Update Refs"; 195 default: 196 ShouldNotReachHere(); 197 return "ERROR"; 198 } 199 }; 200 201 private: 202 ShenandoahSharedBitmap _gc_state; 203 ShenandoahHeapLock _lock; 204 ShenandoahCollectorPolicy* _shenandoah_policy; 205 size_t _bitmap_size; 206 size_t _bitmap_regions_per_slice; 207 size_t _bitmap_bytes_per_slice; 208 MemRegion _heap_region; 209 MemRegion _bitmap0_region; 210 MemRegion _bitmap1_region; 211 MemRegion _aux_bitmap_region; 212 213 // Sortable array of regions 214 ShenandoahHeapRegionSet* _ordered_regions; 215 ShenandoahFreeSet* _free_regions; 216 ShenandoahCollectionSet* _collection_set; 217 218 ShenandoahConcurrentMark* _scm; 219 ShenandoahMarkCompact* _full_gc; 220 ShenandoahPartialGC* _partial_gc; 221 ShenandoahTraversalGC* _traversal_gc; 222 ShenandoahVerifier* _verifier; 223 224 ShenandoahConcurrentThread* _concurrent_gc_thread; 225 226 ShenandoahMonitoringSupport* _monitoring_support; 227 228 ShenandoahPhaseTimings* _phase_timings; 229 ShenandoahAllocTracker* _alloc_tracker; 230 231 size_t _num_regions; 232 size_t _initial_size; 233 234 uint _max_workers; 235 ShenandoahWorkGang* _workers; 236 ShenandoahWorkGang* _safepoint_workers; 237 238 volatile size_t _used; 239 volatile size_t _committed; 240 241 MarkBitMap _verification_bit_map; 242 MarkBitMap _mark_bit_map0; 243 MarkBitMap _mark_bit_map1; 244 MarkBitMap* _complete_mark_bit_map; 245 MarkBitMap* _next_mark_bit_map; 246 MarkBitMap _aux_bit_map; 247 248 HeapWord** _complete_top_at_mark_starts; 249 HeapWord** _complete_top_at_mark_starts_base; 250 251 HeapWord** _next_top_at_mark_starts; 252 HeapWord** _next_top_at_mark_starts_base; 253 254 size_t _bytes_allocated_since_cm; 255 size_t _bytes_allocated_during_cm; 256 size_t _allocated_last_gc; 257 size_t _used_start_gc; 258 259 ShenandoahSharedFlag _degenerated_gc_in_progress; 260 ShenandoahSharedFlag _full_gc_in_progress; 261 ShenandoahSharedFlag _full_gc_move_in_progress; 262 263 ShenandoahSharedFlag _inject_alloc_failure; 264 265 ShenandoahSharedEnumFlag<CancelState> _cancelled_concgc; 266 267 ReferenceProcessor* _ref_processor; 268 269 ShenandoahForwardedIsAliveClosure _forwarded_is_alive; 270 ShenandoahIsAliveClosure _is_alive; 271 272 ConcurrentGCTimer* _gc_timer; 273 274 ShenandoahConnectionMatrix* _connection_matrix; 275 276 GCMemoryManager _minor_memory_manager; 277 GCMemoryManager _major_memory_manager; 278 279 MemoryPool* _memory_pool; 280 MemoryPool* _dummy_pool; 281 282 #ifdef ASSERT 283 int _heap_expansion_count; 284 #endif 285 286 public: 287 ShenandoahHeap(ShenandoahCollectorPolicy* policy); 288 289 const char* name() const /* override */; 290 HeapWord* allocate_new_tlab(size_t word_size) /* override */; 291 void print_on(outputStream* st) const /* override */; 292 void print_extended_on(outputStream *st) const /* override */; 293 294 ShenandoahHeap::Name kind() const /* override */{ 295 return CollectedHeap::ShenandoahHeap; 296 } 297 298 jint initialize() /* override */; 299 void post_initialize() /* override */; 300 size_t capacity() const /* override */; 301 size_t used() const /* override */; 302 size_t committed() const; 303 bool is_maximal_no_gc() const /* override */; 304 size_t max_capacity() const /* override */; 305 size_t initial_capacity() const /* override */; 306 bool is_in(const void* p) const /* override */; 307 bool is_scavengable(oop obj) /* override */; 308 HeapWord* mem_allocate(size_t size, bool* what) /* override */; 309 bool can_elide_tlab_store_barriers() const /* override */; 310 oop new_store_pre_barrier(JavaThread* thread, oop new_obj) /* override */; 311 bool can_elide_initializing_store_barrier(oop new_obj) /* override */; 312 bool card_mark_must_follow_store() const /* override */; 313 void collect(GCCause::Cause cause) /* override */; 314 void do_full_collection(bool clear_all_soft_refs) /* override */; 315 AdaptiveSizePolicy* size_policy() /* override */; 316 CollectorPolicy* collector_policy() const /* override */; 317 void ensure_parsability(bool retire_tlabs) /* override */; 318 HeapWord* block_start(const void* addr) const /* override */; 319 size_t block_size(const HeapWord* addr) const /* override */; 320 bool block_is_obj(const HeapWord* addr) const /* override */; 321 jlong millis_since_last_gc() /* override */; 322 void prepare_for_verify() /* override */; 323 void print_gc_threads_on(outputStream* st) const /* override */; 324 void gc_threads_do(ThreadClosure* tcl) const /* override */; 325 void print_tracing_info() const /* override */; 326 void verify(VerifyOption vo) /* override */; 327 bool supports_tlab_allocation() const /* override */; 328 size_t tlab_capacity(Thread *thr) const /* override */; 329 void object_iterate(ObjectClosure* cl) /* override */; 330 void safe_object_iterate(ObjectClosure* cl) /* override */; 331 size_t unsafe_max_tlab_alloc(Thread *thread) const /* override */; 332 size_t max_tlab_size() const /* override */; 333 void resize_all_tlabs() /* override */; 334 void accumulate_statistics_all_gclabs() /* override */; 335 HeapWord* tlab_post_allocation_setup(HeapWord* obj) /* override */; 336 uint oop_extra_words() /* override */; 337 size_t tlab_used(Thread* ignored) const /* override */; 338 void stop() /* override */; 339 virtual void safepoint_synchronize_begin(); 340 virtual void safepoint_synchronize_end(); 341 342 WorkGang* get_safepoint_workers() { return _safepoint_workers; } 343 344 #ifndef CC_INTERP 345 void compile_prepare_oop(MacroAssembler* masm, Register obj) /* override */; 346 #endif 347 348 void register_nmethod(nmethod* nm); 349 void unregister_nmethod(nmethod* nm); 350 351 void pin_object(oop o) /* override */; 352 void unpin_object(oop o) /* override */; 353 354 static ShenandoahHeap* heap(); 355 static ShenandoahHeap* heap_no_check(); 356 static address in_cset_fast_test_addr(); 357 static address cancelled_concgc_addr(); 358 static address gc_state_addr(); 359 360 ShenandoahCollectorPolicy *shenandoahPolicy() const { return _shenandoah_policy; } 361 ShenandoahPhaseTimings* phase_timings() const { return _phase_timings; } 362 ShenandoahAllocTracker* alloc_tracker() const { return _alloc_tracker; } 363 364 inline ShenandoahHeapRegion* heap_region_containing(const void* addr) const; 365 inline size_t heap_region_index_containing(const void* addr) const; 366 inline bool requires_marking(const void* entry) const; 367 368 template <class T> 369 inline oop evac_update_with_forwarded(T* p, bool &evac); 370 371 template <class T> 372 inline oop maybe_update_with_forwarded(T* p); 373 374 template <class T> 375 inline oop maybe_update_with_forwarded_not_null(T* p, oop obj); 376 377 template <class T> 378 inline oop update_with_forwarded_not_null(T* p, oop obj); 379 380 void trash_cset_regions(); 381 382 void stop_concurrent_marking(); 383 384 void prepare_for_concurrent_evacuation(); 385 void evacuate_and_update_roots(); 386 // Fixup roots after concurrent cycle failed 387 void fixup_roots(); 388 389 void update_heap_references(ShenandoahHeapRegionSet* regions, bool concurrent); 390 391 void roots_iterate(OopClosure* cl); 392 393 private: 394 void set_gc_state_mask(uint mask, bool value); 395 void set_gc_state_mask_concurrently(uint mask, bool value); 396 397 public: 398 void set_concurrent_mark_in_progress(bool in_progress); 399 void set_evacuation_in_progress_concurrently(bool in_progress); 400 void set_evacuation_in_progress_at_safepoint(bool in_progress); 401 void set_update_refs_in_progress(bool in_progress); 402 void set_degenerated_gc_in_progress(bool in_progress); 403 void set_full_gc_in_progress(bool in_progress); 404 void set_full_gc_move_in_progress(bool in_progress); 405 void set_concurrent_partial_in_progress(bool in_progress); 406 void set_concurrent_traversal_in_progress(bool in_progress); 407 void set_has_forwarded_objects(bool cond); 408 409 inline bool is_stable() const; 410 inline bool is_concurrent_mark_in_progress() const; 411 inline bool is_update_refs_in_progress() const; 412 inline bool is_evacuation_in_progress() const; 413 inline bool is_degenerated_gc_in_progress() const; 414 inline bool is_full_gc_in_progress() const; 415 inline bool is_full_gc_move_in_progress() const; 416 inline bool is_concurrent_partial_in_progress() const; 417 inline bool is_concurrent_traversal_in_progress() const; 418 inline bool has_forwarded_objects() const; 419 inline bool is_gc_in_progress_mask(uint mask) const; 420 421 inline bool region_in_collection_set(size_t region_index) const; 422 423 // Mainly there to avoid accidentally calling the templated 424 // method below with ShenandoahHeapRegion* which would be *wrong*. 425 inline bool in_collection_set(ShenandoahHeapRegion* r) const; 426 427 template <class T> 428 inline bool in_collection_set(T obj) const; 429 430 inline bool allocated_after_next_mark_start(HeapWord* addr) const; 431 void set_next_top_at_mark_start(HeapWord* region_base, HeapWord* addr); 432 HeapWord* next_top_at_mark_start(HeapWord* region_base); 433 434 inline bool allocated_after_complete_mark_start(HeapWord* addr) const; 435 void set_complete_top_at_mark_start(HeapWord* region_base, HeapWord* addr); 436 HeapWord* complete_top_at_mark_start(HeapWord* region_base); 437 438 // Evacuates object src. Returns the evacuated object if this thread 439 // succeeded, otherwise rolls back the evacuation and returns the 440 // evacuated object by the competing thread. 'succeeded' is an out 441 // param and set to true if this thread succeeded, otherwise to false. 442 inline oop evacuate_object(oop src, Thread* thread, bool& evacuated, bool from_write_barrier = false); 443 inline bool cancelled_concgc() const; 444 inline bool check_cancelled_concgc_and_yield(bool sts_active = true); 445 inline bool try_cancel_concgc(); 446 inline void clear_cancelled_concgc(); 447 448 ShenandoahHeapRegionSet* regions() const { return _ordered_regions;} 449 ShenandoahFreeSet* free_regions() const { return _free_regions; } 450 ShenandoahCollectionSet* collection_set() const { return _collection_set; } 451 void clear_free_regions(); 452 void add_free_region(ShenandoahHeapRegion* r); 453 454 ShenandoahConnectionMatrix* connection_matrix() const; 455 456 void increase_used(size_t bytes); 457 void decrease_used(size_t bytes); 458 459 void set_used(size_t bytes); 460 461 void increase_committed(size_t bytes); 462 void decrease_committed(size_t bytes); 463 464 void handle_heap_shrinkage(); 465 466 size_t garbage(); 467 468 void reset_next_mark_bitmap(); 469 void reset_complete_mark_bitmap(); 470 471 MarkBitMap* complete_mark_bit_map(); 472 MarkBitMap* next_mark_bit_map(); 473 inline bool is_marked_complete(oop obj) const; 474 inline bool mark_next(oop obj) const; 475 inline bool is_marked_next(oop obj) const; 476 bool is_next_bitmap_clear(); 477 bool is_next_bitmap_clear_range(HeapWord* start, HeapWord* end); 478 bool is_complete_bitmap_clear_range(HeapWord* start, HeapWord* end); 479 480 bool commit_bitmap_slice(ShenandoahHeapRegion *r); 481 bool uncommit_bitmap_slice(ShenandoahHeapRegion *r); 482 483 // Hint that the bitmap slice is not needed 484 bool idle_bitmap_slice(ShenandoahHeapRegion* r); 485 void activate_bitmap_slice(ShenandoahHeapRegion* r); 486 487 bool is_bitmap_slice_committed(ShenandoahHeapRegion* r, bool skip_self = false); 488 489 void print_heap_regions_on(outputStream* st) const; 490 491 size_t bytes_allocated_since_cm(); 492 void set_bytes_allocated_since_cm(size_t bytes); 493 494 size_t trash_humongous_region_at(ShenandoahHeapRegion *r); 495 496 virtual GrowableArray<GCMemoryManager*> memory_managers(); 497 virtual GrowableArray<MemoryPool*> memory_pools(); 498 499 ShenandoahMonitoringSupport* monitoring_support(); 500 ShenandoahConcurrentMark* concurrentMark() { return _scm; } 501 ShenandoahMarkCompact* full_gc() { return _full_gc; } 502 ShenandoahPartialGC* partial_gc(); 503 ShenandoahTraversalGC* traversal_gc(); 504 ShenandoahVerifier* verifier(); 505 506 ReferenceProcessor* ref_processor() { return _ref_processor;} 507 508 WorkGang* workers() const { return _workers;} 509 510 uint max_workers(); 511 512 void assert_gc_workers(uint nworker) PRODUCT_RETURN; 513 514 void do_evacuation(); 515 ShenandoahHeapRegion* next_compaction_region(const ShenandoahHeapRegion* r); 516 517 void heap_region_iterate(ShenandoahHeapRegionClosure* blk, bool skip_cset_regions = false, bool skip_humongous_continuation = false) const; 518 519 // Delete entries for dead interned string and clean up unreferenced symbols 520 // in symbol table, possibly in parallel. 521 void unload_classes_and_cleanup_tables(bool full_gc); 522 523 inline size_t num_regions() const { return _num_regions; } 524 525 BoolObjectClosure* is_alive_closure(); 526 527 private: 528 template<class T> 529 inline void marked_object_iterate(ShenandoahHeapRegion* region, T* cl, HeapWord* limit); 530 531 template<class T> 532 inline void marked_object_oop_iterate(ShenandoahHeapRegion* region, T* cl, HeapWord* limit); 533 534 public: 535 template<class T> 536 inline void marked_object_iterate(ShenandoahHeapRegion* region, T* cl); 537 538 template<class T> 539 inline void marked_object_safe_iterate(ShenandoahHeapRegion* region, T* cl); 540 541 template<class T> 542 inline void marked_object_oop_iterate(ShenandoahHeapRegion* region, T* cl); 543 544 template<class T> 545 inline void marked_object_oop_safe_iterate(ShenandoahHeapRegion* region, T* cl); 546 547 GCTimer* gc_timer() const; 548 549 void swap_mark_bitmaps(); 550 551 void cancel_concgc(GCCause::Cause cause); 552 553 ShenandoahHeapLock* lock() { return &_lock; } 554 void assert_heaplock_owned_by_current_thread() PRODUCT_RETURN; 555 void assert_heaplock_not_owned_by_current_thread() PRODUCT_RETURN; 556 void assert_heaplock_or_safepoint() PRODUCT_RETURN; 557 558 public: 559 typedef enum { 560 _alloc_shared, // Allocate common, outside of TLAB 561 _alloc_shared_gc, // Allocate common, outside of GCLAB 562 _alloc_tlab, // Allocate TLAB 563 _alloc_gclab, // Allocate GCLAB 564 _ALLOC_LIMIT, 565 } AllocType; 566 567 static const char* alloc_type_to_string(AllocType type) { 568 switch (type) { 569 case _alloc_shared: 570 return "Shared"; 571 case _alloc_shared_gc: 572 return "Shared GC"; 573 case _alloc_tlab: 574 return "TLAB"; 575 case _alloc_gclab: 576 return "GCLAB"; 577 default: 578 ShouldNotReachHere(); 579 return ""; 580 } 581 } 582 private: 583 584 virtual void initialize_serviceability(); 585 586 HeapWord* allocate_new_lab(size_t word_size, AllocType type); 587 HeapWord* allocate_memory_under_lock(size_t word_size, AllocType type, bool &new_region); 588 HeapWord* allocate_memory(size_t word_size, AllocType type); 589 // Shenandoah functionality. 590 inline HeapWord* allocate_from_gclab(Thread* thread, size_t size); 591 HeapWord* allocate_from_gclab_slow(Thread* thread, size_t size); 592 HeapWord* allocate_new_gclab(size_t word_size); 593 594 template<class T> 595 inline void do_marked_object(MarkBitMap* bitmap, T* cl, oop obj); 596 597 ShenandoahConcurrentThread* concurrent_thread() { return _concurrent_gc_thread; } 598 599 inline bool mark_next_no_checks(oop obj) const; 600 601 public: 602 inline oop atomic_compare_exchange_oop(oop n, narrowOop* addr, oop c); 603 inline oop atomic_compare_exchange_oop(oop n, oop* addr, oop c); 604 605 private: 606 void ref_processing_init(); 607 608 GCTracer* tracer(); 609 610 private: 611 uint64_t _alloc_seq_at_last_gc_start; 612 uint64_t _alloc_seq_at_last_gc_end; 613 size_t _used_at_last_gc; 614 615 public: 616 void recycle_trash_assist(size_t limit); 617 void recycle_trash(); 618 619 uint64_t alloc_seq_at_last_gc_end() const { return _alloc_seq_at_last_gc_end; } 620 uint64_t alloc_seq_at_last_gc_start() const { return _alloc_seq_at_last_gc_start;} 621 size_t used_at_last_gc() const { return _used_at_last_gc;} 622 623 void set_alloc_seq_gc_start(); 624 void set_alloc_seq_gc_end(); 625 626 void set_used_at_last_gc() {_used_at_last_gc = used();} 627 628 void make_tlabs_parsable(bool retire_tlabs) /* override */; 629 630 GCMemoryManager* major_memory_manager() { return &_major_memory_manager; } 631 GCMemoryManager* minor_memory_manager() { return &_minor_memory_manager; } 632 633 public: 634 // Entry points to STW GC operations, these cause a related safepoint, that then 635 // call the entry method below 636 void vmop_entry_init_mark(); 637 void vmop_entry_final_mark(); 638 void vmop_entry_init_updaterefs(); 639 void vmop_entry_final_updaterefs(); 640 void vmop_entry_init_partial(); 641 void vmop_entry_final_partial(); 642 void vmop_entry_init_traversal(); 643 void vmop_entry_final_traversal(); 644 void vmop_entry_full(GCCause::Cause cause); 645 void vmop_entry_verify_after_evac(); 646 void vmop_degenerated(ShenandoahDegenerationPoint point); 647 648 // Entry methods to normally STW GC operations. These set up logging, monitoring 649 // and workers for net VM operation 650 void entry_init_mark(); 651 void entry_final_mark(); 652 void entry_init_updaterefs(); 653 void entry_final_updaterefs(); 654 void entry_init_partial(); 655 void entry_final_partial(); 656 void entry_init_traversal(); 657 void entry_final_traversal(); 658 void entry_full(GCCause::Cause cause); 659 void entry_verify_after_evac(); 660 void entry_degenerated(int point); 661 662 // Entry methods to normally concurrent GC operations. These set up logging, monitoring 663 // for concurrent operation. 664 void entry_mark(); 665 void entry_preclean(); 666 void entry_cleanup(); 667 void entry_cleanup_bitmaps(); 668 void entry_evac(); 669 void entry_updaterefs(); 670 void entry_partial(); 671 void entry_traversal(); 672 673 private: 674 // Actual work for the phases 675 void op_init_mark(); 676 void op_final_mark(); 677 void op_init_updaterefs(); 678 void op_final_updaterefs(); 679 void op_init_partial(); 680 void op_final_partial(); 681 void op_init_traversal(); 682 void op_final_traversal(); 683 void op_full(GCCause::Cause cause); 684 void op_verify_after_evac(); 685 void op_degenerated(ShenandoahDegenerationPoint point); 686 void op_degenerated_fail(); 687 void op_degenerated_futile(); 688 689 void op_mark(); 690 void op_preclean(); 691 void op_cleanup(); 692 void op_evac(); 693 void op_updaterefs(); 694 void op_cleanup_bitmaps(); 695 void op_partial(); 696 void op_traversal(); 697 698 private: 699 void try_inject_alloc_failure(); 700 bool should_inject_alloc_failure(); 701 }; 702 703 #endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHHEAP_HPP