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
49 public:
50 ShenandoahConcurrentGC();
51 bool collect(GCCause::Cause cause);
52 ShenandoahDegenPoint degen_point() const;
53
54 // Cancel ongoing concurrent GC
55 static void cancel();
56 private:
57 // Entry points to STW GC operations, these cause a related safepoint, that then
58 // call the entry method below
59 void vmop_entry_init_mark();
60 void vmop_entry_final_mark();
61 void vmop_entry_init_updaterefs();
62 void vmop_entry_final_updaterefs();
63 void vmop_entry_final_roots();
64
65 // Entry methods to normally STW GC operations. These set up logging, monitoring
66 // and workers for net VM operation
67 void entry_init_mark();
68 void entry_final_mark();
69 void entry_init_updaterefs();
70 void entry_final_updaterefs();
71 void entry_final_roots();
72
73 // Entry methods to normally concurrent GC operations. These set up logging, monitoring
74 // for concurrent operation.
75 void entry_reset();
76 void entry_mark_roots();
77 void entry_mark();
78 void entry_thread_roots();
79 void entry_weak_refs();
80 void entry_weak_roots();
81 void entry_class_unloading();
82 void entry_strong_roots();
83 void entry_cleanup_early();
84 void entry_evacuate();
85 void entry_update_thread_roots();
86 void entry_updaterefs();
87 void entry_cleanup_complete();
88
89 // Actual work for the phases
90 void op_reset();
91 void op_init_mark();
92 void op_mark_roots();
93 void op_mark();
94 void op_final_mark();
95 void op_thread_roots();
96 void op_weak_refs();
97 void op_weak_roots();
98 void op_class_unloading();
99 void op_strong_roots();
100 void op_cleanup_early();
101 void op_evacuate();
102 void op_init_updaterefs();
103 void op_updaterefs();
104 void op_update_thread_roots();
105 void op_final_updaterefs();
106 void op_final_roots();
107 void op_cleanup_complete();
108
109 void start_mark();
110
111 // Messages for GC trace events, they have to be immortal for
112 // passing around the logging/tracing systems
113 const char* init_mark_event_message() const;
114 const char* final_mark_event_message() const;
115 const char* conc_mark_event_message() const;
116
117 // Check GC cancellation and abort concurrent GC
118 bool check_cancellation_and_abort(ShenandoahDegenPoint point);
119 };
120
121 #endif // SHARE_GC_SHENANDOAH_SHENANDOAHCONCURRENTGC_HPP
|
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 ShenandoahGeneration;
34
35 class VM_ShenandoahInitMark;
36 class VM_ShenandoahFinalMarkStartEvac;
37 class VM_ShenandoahInitUpdateRefs;
38 class VM_ShenandoahFinalUpdateRefs;
39
40 class ShenandoahConcurrentGC : public ShenandoahGC {
41 friend class VM_ShenandoahInitMark;
42 friend class VM_ShenandoahFinalMarkStartEvac;
43 friend class VM_ShenandoahInitUpdateRefs;
44 friend class VM_ShenandoahFinalUpdateRefs;
45 friend class VM_ShenandoahFinalRoots;
46
47 protected:
48 ShenandoahConcurrentMark _mark;
49
50 private:
51 ShenandoahDegenPoint _degen_point;
52 bool _abbreviated;
53 const bool _do_old_gc_bootstrap;
54
55 protected:
56 ShenandoahGeneration* const _generation;
57
58 public:
59 ShenandoahConcurrentGC(ShenandoahGeneration* generation, bool do_old_gc_bootstrap);
60 bool collect(GCCause::Cause cause);
61 ShenandoahDegenPoint degen_point() const;
62 bool abbreviated() const { return _abbreviated; }
63
64 private:
65 // Entry points to STW GC operations, these cause a related safepoint, that then
66 // call the entry method below
67 void vmop_entry_init_mark();
68
69 protected:
70 void vmop_entry_final_mark();
71 void vmop_entry_final_roots(bool incr_region_ages);
72
73 private:
74 void vmop_entry_init_updaterefs();
75 void vmop_entry_final_updaterefs();
76
77 // Entry methods to normally STW GC operations. These set up logging, monitoring
78 // and workers for net VM operation
79 void entry_init_mark();
80 void entry_final_mark();
81 void entry_init_updaterefs();
82 void entry_final_updaterefs();
83 void entry_final_roots();
84
85 // Entry methods to normally concurrent GC operations. These set up logging, monitoring
86 // for concurrent operation.
87 void entry_reset();
88 void entry_mark_roots();
89 void entry_scan_remembered_set();
90
91 protected:
92 void entry_mark();
93 void entry_thread_roots();
94 void entry_weak_refs();
95 void entry_weak_roots();
96 void entry_class_unloading();
97 void entry_strong_roots();
98 void entry_cleanup_early();
99 virtual void op_final_mark();
100
101 private:
102 void entry_evacuate();
103 void entry_update_thread_roots();
104 void entry_updaterefs();
105 void entry_cleanup_complete();
106 void entry_global_coalesce_and_fill();
107
108 // Actual work for the phases
109 void op_reset();
110 void op_init_mark();
111 void op_mark_roots();
112 void op_mark();
113 void op_thread_roots();
114 void op_weak_refs();
115 void op_weak_roots();
116 void op_class_unloading();
117 void op_strong_roots();
118 void op_cleanup_early();
119 void op_evacuate();
120 void op_init_updaterefs();
121 void op_updaterefs();
122 void op_update_thread_roots();
123 void op_final_updaterefs();
124 void op_final_roots();
125 void op_cleanup_complete();
126 void op_global_coalesce_and_fill();
127
128 void start_mark();
129
130 // Messages for GC trace events, they have to be immortal for
131 // passing around the logging/tracing systems
132 void init_mark_event_message(char* buf, size_t len) const;
133 void final_mark_event_message(char* buf, size_t len) const;
134 void conc_mark_event_message(char* buf, size_t len) const;
135
136 protected:
137 // Check GC cancellation and abort concurrent GC
138 bool check_cancellation_and_abort(ShenandoahDegenPoint point);
139 };
140
141 #endif // SHARE_GC_SHENANDOAH_SHENANDOAHCONCURRENTGC_HPP
|