1 /*
2 * Copyright (c) 2021, Red Hat, Inc. 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_SHENANDOAH_SHENANDOAHCONCURRENTGC_HPP
26 #define SHARE_GC_SHENANDOAH_SHENANDOAHCONCURRENTGC_HPP
27
28 #include "gc/shared/gcCause.hpp"
29 #include "gc/shenandoah/shenandoahConcurrentMark.hpp"
30 #include "gc/shenandoah/shenandoahGC.hpp"
31 #include "gc/shenandoah/shenandoahHeap.hpp"
32
33 class VM_ShenandoahInitMark;
34 class VM_ShenandoahFinalMarkStartEvac;
35 class VM_ShenandoahInitUpdateRefs;
36 class VM_ShenandoahFinalUpdateRefs;
37
38 class ShenandoahConcurrentGC : public ShenandoahGC {
39 friend class VM_ShenandoahInitMark;
40 friend class VM_ShenandoahFinalMarkStartEvac;
41 friend class VM_ShenandoahInitUpdateRefs;
42 friend class VM_ShenandoahFinalUpdateRefs;
43 friend class VM_ShenandoahFinalRoots;
44
45 private:
46 ShenandoahConcurrentMark _mark;
47 ShenandoahDegenPoint _degen_point;
48 bool _abbreviated;
49
50 public:
51 ShenandoahConcurrentGC();
52 bool collect(GCCause::Cause cause);
53 ShenandoahDegenPoint degen_point() const;
54
55 // Return true if this cycle found enough immediate garbage to skip evacuation
56 bool abbreviated() const { return _abbreviated; }
57
58 // Cancel ongoing concurrent GC
59 static void cancel();
60 private:
61 // Entry points to STW GC operations, these cause a related safepoint, that then
62 // call the entry method below
63 void vmop_entry_init_mark();
64 void vmop_entry_final_mark();
65 void vmop_entry_init_updaterefs();
66 void vmop_entry_final_updaterefs();
67 void vmop_entry_final_roots();
68
69 // Entry methods to normally STW GC operations. These set up logging, monitoring
70 // and workers for net VM operation
71 void entry_init_mark();
72 void entry_final_mark();
73 void entry_init_updaterefs();
74 void entry_final_updaterefs();
75 void entry_final_roots();
76
77 // Entry methods to normally concurrent GC operations. These set up logging, monitoring
78 // for concurrent operation.
79 void entry_reset();
80 void entry_mark_roots();
81 void entry_mark();
82 void entry_thread_roots();
83 void entry_weak_refs();
84 void entry_weak_roots();
85 void entry_class_unloading();
86 void entry_strong_roots();
87 void entry_cleanup_early();
88 void entry_evacuate();
89 void entry_update_thread_roots();
90 void entry_updaterefs();
91 void entry_cleanup_complete();
92
93 // Actual work for the phases
94 void op_reset();
95 void op_init_mark();
96 void op_mark_roots();
97 void op_mark();
98 void op_final_mark();
99 void op_thread_roots();
100 void op_weak_refs();
101 void op_weak_roots();
102 void op_class_unloading();
103 void op_strong_roots();
104 void op_cleanup_early();
105 void op_evacuate();
106 void op_init_updaterefs();
107 void op_updaterefs();
108 void op_update_thread_roots();
109 void op_final_updaterefs();
110 void op_final_roots();
111 void op_cleanup_complete();
112
113 void start_mark();
114
115 // Messages for GC trace events, they have to be immortal for
116 // passing around the logging/tracing systems
117 const char* init_mark_event_message() const;
118 const char* final_mark_event_message() const;
119 const char* conc_mark_event_message() const;
120
121 // Check GC cancellation and abort concurrent GC
122 bool check_cancellation_and_abort(ShenandoahDegenPoint point);
123 };
124
125 #endif // SHARE_GC_SHENANDOAH_SHENANDOAHCONCURRENTGC_HPP
|
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
|