1 /*
2 * Copyright (c) 2001, 2015, Oracle and/or its affiliates. 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 *
113 }
114
115
116 void G1MarkSweep::allocate_stacks() {
117 GenMarkSweep::_preserved_count_max = 0;
118 GenMarkSweep::_preserved_marks = NULL;
119 GenMarkSweep::_preserved_count = 0;
120 }
121
122 void G1MarkSweep::mark_sweep_phase1(bool& marked_for_unloading,
123 bool clear_all_softrefs) {
124 // Recursively traverse all live objects and mark them
125 GCTraceTime(Info, gc, phases) tm("Phase 1: Mark live objects", gc_timer());
126
127 G1CollectedHeap* g1h = G1CollectedHeap::heap();
128
129 // Need cleared claim bits for the roots processing
130 ClassLoaderDataGraph::clear_claimed_marks();
131
132 MarkingCodeBlobClosure follow_code_closure(&GenMarkSweep::follow_root_closure, !CodeBlobToOopClosure::FixRelocations);
133 {
134 G1RootProcessor root_processor(g1h, 1);
135 root_processor.process_strong_roots(&GenMarkSweep::follow_root_closure,
136 &GenMarkSweep::follow_cld_closure,
137 &follow_code_closure);
138 }
139
140 {
141 GCTraceTime(Debug, gc, phases) trace("Reference Processing", gc_timer());
142
143 // Process reference objects found during marking
144 ReferenceProcessor* rp = GenMarkSweep::ref_processor();
145 assert(rp == g1h->ref_processor_stw(), "Sanity");
146
147 rp->setup_policy(clear_all_softrefs);
148 const ReferenceProcessorStats& stats =
149 rp->process_discovered_references(&GenMarkSweep::is_alive,
150 &GenMarkSweep::keep_alive,
151 &GenMarkSweep::follow_stack_closure,
152 NULL,
153 gc_timer());
154 gc_tracer()->report_gc_reference_stats(stats);
155 }
156
157 // This is the point where the entire marking should have completed.
158 assert(GenMarkSweep::_marking_stack.is_empty(), "Marking should have completed");
159
160 {
161 GCTraceTime(Debug, gc, phases) trace("Class Unloading", gc_timer());
162
163 // Unload classes and purge the SystemDictionary.
164 bool purged_class = SystemDictionary::do_unloading(&GenMarkSweep::is_alive);
165
166 // Unload nmethods.
167 CodeCache::do_unloading(&GenMarkSweep::is_alive, purged_class);
168
169 // Prune dead klasses from subklass/sibling/implementor lists.
170 Klass::clean_weak_klass_links(&GenMarkSweep::is_alive);
171 }
172
173 {
174 GCTraceTime(Debug, gc, phases) trace("Scrub String and Symbol Tables", gc_timer());
175 // Delete entries for dead interned string and clean up unreferenced symbols in symbol table.
176 g1h->unlink_string_and_symbol_table(&GenMarkSweep::is_alive);
177 }
178
179 if (G1StringDedup::is_enabled()) {
180 GCTraceTime(Debug, gc, phases) trace("String Deduplication Unlink", gc_timer());
|
1 /*
2 * Copyright (c) 2001, 2016, Oracle and/or its affiliates. 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 *
113 }
114
115
116 void G1MarkSweep::allocate_stacks() {
117 GenMarkSweep::_preserved_count_max = 0;
118 GenMarkSweep::_preserved_marks = NULL;
119 GenMarkSweep::_preserved_count = 0;
120 }
121
122 void G1MarkSweep::mark_sweep_phase1(bool& marked_for_unloading,
123 bool clear_all_softrefs) {
124 // Recursively traverse all live objects and mark them
125 GCTraceTime(Info, gc, phases) tm("Phase 1: Mark live objects", gc_timer());
126
127 G1CollectedHeap* g1h = G1CollectedHeap::heap();
128
129 // Need cleared claim bits for the roots processing
130 ClassLoaderDataGraph::clear_claimed_marks();
131
132 MarkingCodeBlobClosure follow_code_closure(&GenMarkSweep::follow_root_closure, !CodeBlobToOopClosure::FixRelocations);
133 if (ClassUnloading) {
134 G1RootProcessor root_processor(g1h, 1);
135 root_processor.process_strong_roots(&GenMarkSweep::follow_root_closure,
136 &GenMarkSweep::follow_cld_closure,
137 &follow_code_closure);
138 } else {
139 G1RootProcessor root_processor(g1h, 1);
140 root_processor.process_all_roots(&GenMarkSweep::follow_root_closure,
141 &GenMarkSweep::follow_cld_closure,
142 &follow_code_closure);
143 }
144
145 {
146 GCTraceTime(Debug, gc, phases) trace("Reference Processing", gc_timer());
147
148 // Process reference objects found during marking
149 ReferenceProcessor* rp = GenMarkSweep::ref_processor();
150 assert(rp == g1h->ref_processor_stw(), "Sanity");
151
152 rp->setup_policy(clear_all_softrefs);
153 const ReferenceProcessorStats& stats =
154 rp->process_discovered_references(&GenMarkSweep::is_alive,
155 &GenMarkSweep::keep_alive,
156 &GenMarkSweep::follow_stack_closure,
157 NULL,
158 gc_timer());
159 gc_tracer()->report_gc_reference_stats(stats);
160 }
161
162 // This is the point where the entire marking should have completed.
163 assert(GenMarkSweep::_marking_stack.is_empty(), "Marking should have completed");
164
165 if (ClassUnloading) {
166 GCTraceTime(Debug, gc, phases) trace("Class Unloading", gc_timer());
167
168 // Unload classes and purge the SystemDictionary.
169 bool purged_class = SystemDictionary::do_unloading(&GenMarkSweep::is_alive);
170
171 // Unload nmethods.
172 CodeCache::do_unloading(&GenMarkSweep::is_alive, purged_class);
173
174 // Prune dead klasses from subklass/sibling/implementor lists.
175 Klass::clean_weak_klass_links(&GenMarkSweep::is_alive);
176 }
177
178 {
179 GCTraceTime(Debug, gc, phases) trace("Scrub String and Symbol Tables", gc_timer());
180 // Delete entries for dead interned string and clean up unreferenced symbols in symbol table.
181 g1h->unlink_string_and_symbol_table(&GenMarkSweep::is_alive);
182 }
183
184 if (G1StringDedup::is_enabled()) {
185 GCTraceTime(Debug, gc, phases) trace("String Deduplication Unlink", gc_timer());
|