1 /* 2 * Copyright (c) 2021, Red Hat, Inc. All rights reserved. 3 * Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. 4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 5 * 6 * This code is free software; you can redistribute it and/or modify it 7 * under the terms of the GNU General Public License version 2 only, as 8 * published by the Free Software Foundation. 9 * 10 * This code is distributed in the hope that it will be useful, but WITHOUT 11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 13 * version 2 for more details (a copy is included in the LICENSE file that 14 * accompanied this code). 15 * 16 * You should have received a copy of the GNU General Public License version 17 * 2 along with this work; if not, write to the Free Software Foundation, 18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 19 * 20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 21 * or visit www.oracle.com if you need additional information or have any 22 * questions. 23 * 24 */ 25 26 #ifndef SHARE_GC_SHENANDOAH_SHENANDOAHCONCURRENTGC_HPP 27 #define SHARE_GC_SHENANDOAH_SHENANDOAHCONCURRENTGC_HPP 28 29 #include "gc/shared/gcCause.hpp" 30 #include "gc/shenandoah/shenandoahConcurrentMark.hpp" 31 #include "gc/shenandoah/shenandoahGC.hpp" 32 #include "gc/shenandoah/shenandoahHeap.hpp" 33 34 class ShenandoahGeneration; 35 36 class VM_ShenandoahInitMark; 37 class VM_ShenandoahFinalMarkStartEvac; 38 class VM_ShenandoahInitUpdateRefs; 39 class VM_ShenandoahFinalUpdateRefs; 40 41 class ShenandoahConcurrentGC : public ShenandoahGC { 42 friend class VM_ShenandoahInitMark; 43 friend class VM_ShenandoahFinalMarkStartEvac; 44 friend class VM_ShenandoahInitUpdateRefs; 45 friend class VM_ShenandoahFinalUpdateRefs; 46 friend class VM_ShenandoahFinalRoots; 47 48 protected: 49 ShenandoahConcurrentMark _mark; 50 ShenandoahGeneration* const _generation; 51 52 private: 53 ShenandoahDegenPoint _degen_point; 54 bool _abbreviated; 55 const bool _do_old_gc_bootstrap; 56 57 public: 58 ShenandoahConcurrentGC(ShenandoahGeneration* generation, bool do_old_gc_bootstrap); 59 bool collect(GCCause::Cause cause) override; 60 ShenandoahDegenPoint degen_point() const; 61 62 // Return true if this cycle found enough immediate garbage to skip evacuation 63 bool abbreviated() const { return _abbreviated; } 64 65 protected: 66 // Entry points to STW GC operations, these cause a related safepoint, that then 67 // call the entry method below 68 void vmop_entry_init_mark(); 69 void vmop_entry_final_mark(); 70 void vmop_entry_init_updaterefs(); 71 void vmop_entry_final_updaterefs(); 72 void vmop_entry_final_roots(); 73 74 // Entry methods to normally STW GC operations. These set up logging, monitoring 75 // and workers for net VM operation 76 void entry_init_mark(); 77 void entry_final_mark(); 78 void entry_init_updaterefs(); 79 void entry_final_updaterefs(); 80 void entry_final_roots(); 81 82 // Entry methods to normally concurrent GC operations. These set up logging, monitoring 83 // for concurrent operation. 84 void entry_reset(); 85 void entry_mark_roots(); 86 void entry_scan_remembered_set(); 87 void entry_mark(); 88 void entry_thread_roots(); 89 void entry_weak_refs(); 90 void entry_weak_roots(); 91 void entry_class_unloading(); 92 void entry_strong_roots(); 93 void entry_cleanup_early(); 94 void entry_evacuate(); 95 void entry_update_thread_roots(); 96 void entry_updaterefs(); 97 void entry_cleanup_complete(); 98 99 // Called when the collection set is empty, but the generational mode has regions to promote in place 100 void entry_promote_in_place(); 101 102 // Actual work for the phases 103 void op_reset(); 104 void op_init_mark(); 105 void op_mark_roots(); 106 void op_mark(); 107 virtual void op_final_mark(); 108 void op_thread_roots(); 109 void op_weak_refs(); 110 void op_weak_roots(); 111 void op_class_unloading(); 112 void op_strong_roots(); 113 void op_cleanup_early(); 114 void op_evacuate(); 115 void op_init_updaterefs(); 116 void op_updaterefs(); 117 void op_update_thread_roots(); 118 void op_final_updaterefs(); 119 void op_final_roots(); 120 void op_cleanup_complete(); 121 122 // Check GC cancellation and abort concurrent GC 123 bool check_cancellation_and_abort(ShenandoahDegenPoint point); 124 125 private: 126 void start_mark(); 127 128 static bool has_in_place_promotions(ShenandoahHeap* heap) ; 129 130 // Messages for GC trace events, they have to be immortal for 131 // passing around the logging/tracing systems 132 const char* init_mark_event_message() const; 133 const char* final_mark_event_message() const; 134 const char* final_roots_event_message() const; 135 const char* conc_mark_event_message() const; 136 const char* conc_reset_event_message() const; 137 const char* conc_weak_refs_event_message() const; 138 const char* conc_weak_roots_event_message() const; 139 const char* conc_cleanup_event_message() const; 140 }; 141 142 #endif // SHARE_GC_SHENANDOAH_SHENANDOAHCONCURRENTGC_HPP