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