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 51 private: 52 ShenandoahDegenPoint _degen_point; 53 bool _abbreviated; 54 const bool _do_old_gc_bootstrap; 55 56 protected: 57 ShenandoahGeneration* const _generation; 58 59 public: 60 ShenandoahConcurrentGC(ShenandoahGeneration* generation, bool do_old_gc_bootstrap); 61 bool collect(GCCause::Cause cause) override; 62 ShenandoahDegenPoint degen_point() const; 63 64 // Return true if this cycle found enough immediate garbage to skip evacuation 65 bool abbreviated() const { return _abbreviated; } 66 67 private: 68 // Entry points to STW GC operations, these cause a related safepoint, that then 69 // call the entry method below 70 void vmop_entry_init_mark(); 71 72 protected: 73 void vmop_entry_final_mark(); 74 void vmop_entry_final_roots(); 75 76 private: 77 void vmop_entry_init_updaterefs(); 78 void vmop_entry_final_updaterefs(); 79 80 // Entry methods to normally STW GC operations. These set up logging, monitoring 81 // and workers for net VM operation 82 void entry_init_mark(); 83 void entry_final_mark(); 84 void entry_init_updaterefs(); 85 void entry_final_updaterefs(); 86 void entry_final_roots(); 87 88 // Entry methods to normally concurrent GC operations. These set up logging, monitoring 89 // for concurrent operation. 90 void entry_reset(); 91 void entry_mark_roots(); 92 void entry_scan_remembered_set(); 93 94 protected: 95 void entry_mark(); 96 void entry_thread_roots(); 97 void entry_weak_refs(); 98 void entry_weak_roots(); 99 void entry_class_unloading(); 100 void entry_strong_roots(); 101 void entry_cleanup_early(); 102 103 private: 104 void entry_evacuate(); 105 void entry_update_thread_roots(); 106 void entry_updaterefs(); 107 108 void entry_cleanup_complete(); 109 110 // Called when the collection set is empty, but the generational mode has regions to promote in place 111 void entry_promote_in_place(); 112 113 // Actual work for the phases 114 void op_reset(); 115 void op_init_mark(); 116 void op_mark_roots(); 117 void op_mark(); 118 void op_thread_roots(); 119 void op_weak_refs(); 120 void op_weak_roots(); 121 void op_class_unloading(); 122 void op_strong_roots(); 123 void op_cleanup_early(); 124 void op_evacuate(); 125 void op_init_updaterefs(); 126 void op_updaterefs(); 127 void op_update_thread_roots(); 128 void op_final_updaterefs(); 129 void op_final_roots(); 130 131 void op_cleanup_complete(); 132 133 protected: 134 virtual void op_final_mark(); 135 136 private: 137 void start_mark(); 138 139 static bool has_in_place_promotions(ShenandoahHeap* heap) ; 140 141 // Messages for GC trace events, they have to be immortal for 142 // passing around the logging/tracing systems 143 const char* init_mark_event_message() const; 144 const char* final_mark_event_message() const; 145 const char* final_roots_event_message() const; 146 const char* conc_mark_event_message() const; 147 const char* conc_reset_event_message() const; 148 const char* conc_weak_refs_event_message() const; 149 const char* conc_weak_roots_event_message() const; 150 const char* conc_cleanup_event_message() const; 151 152 protected: 153 // Check GC cancellation and abort concurrent GC 154 bool check_cancellation_and_abort(ShenandoahDegenPoint point); 155 }; 156 157 #endif // SHARE_GC_SHENANDOAH_SHENANDOAHCONCURRENTGC_HPP