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 #include "precompiled.hpp"
26 #include "classfile/javaClasses.hpp"
27 #include "classfile/symbolTable.hpp"
28 #include "classfile/systemDictionary.hpp"
29 #include "classfile/vmSymbols.hpp"
30 #include "code/codeCache.hpp"
31 #include "code/icBuffer.hpp"
32 #include "gc_implementation/g1/g1Log.hpp"
33 #include "gc_implementation/g1/g1MarkSweep.hpp"
34 #include "gc_implementation/g1/g1StringDedup.hpp"
35 #include "gc_implementation/shared/gcHeapSummary.hpp"
36 #include "gc_implementation/shared/gcTimer.hpp"
37 #include "gc_implementation/shared/gcTrace.hpp"
38 #include "gc_implementation/shared/gcTraceTime.hpp"
39 #include "memory/gcLocker.hpp"
40 #include "memory/genCollectedHeap.hpp"
41 #include "memory/modRefBarrierSet.hpp"
42 #include "memory/referencePolicy.hpp"
43 #include "memory/space.hpp"
44 #include "oops/instanceRefKlass.hpp"
45 #include "oops/oop.inline.hpp"
46 #include "prims/jvmtiExport.hpp"
47 #include "runtime/biasedLocking.hpp"
48 #include "runtime/fprofiler.hpp"
49 #include "runtime/synchronizer.hpp"
50 #include "runtime/thread.hpp"
51 #include "runtime/vmThread.hpp"
52 #include "utilities/copy.hpp"
53 #include "utilities/events.hpp"
109 CodeCache::gc_epilogue();
110 JvmtiExport::gc_epilogue();
111
112 // refs processing: clean slate
113 GenMarkSweep::_ref_processor = NULL;
114 }
115
116
117 void G1MarkSweep::allocate_stacks() {
118 GenMarkSweep::_preserved_count_max = 0;
119 GenMarkSweep::_preserved_marks = NULL;
120 GenMarkSweep::_preserved_count = 0;
121 }
122
123 void G1MarkSweep::mark_sweep_phase1(bool& marked_for_unloading,
124 bool clear_all_softrefs) {
125 // Recursively traverse all live objects and mark them
126 GCTraceTime tm("phase 1", G1Log::fine() && Verbose, true, gc_timer(), gc_tracer()->gc_id());
127 GenMarkSweep::trace(" 1");
128
129 SharedHeap* sh = SharedHeap::heap();
130
131 // Need cleared claim bits for the roots processing
132 ClassLoaderDataGraph::clear_claimed_marks();
133
134 MarkingCodeBlobClosure follow_code_closure(&GenMarkSweep::follow_root_closure, !CodeBlobToOopClosure::FixRelocations);
135 sh->process_strong_roots(true, // activate StrongRootsScope
136 SharedHeap::SO_None,
137 &GenMarkSweep::follow_root_closure,
138 &GenMarkSweep::follow_cld_closure,
139 &follow_code_closure);
140
141 // Process reference objects found during marking
142 ReferenceProcessor* rp = GenMarkSweep::ref_processor();
143 assert(rp == G1CollectedHeap::heap()->ref_processor_stw(), "Sanity");
144
145 rp->setup_policy(clear_all_softrefs);
146 const ReferenceProcessorStats& stats =
147 rp->process_discovered_references(&GenMarkSweep::is_alive,
148 &GenMarkSweep::keep_alive,
149 &GenMarkSweep::follow_stack_closure,
150 NULL,
151 gc_timer(),
152 gc_tracer()->gc_id());
153 gc_tracer()->report_gc_reference_stats(stats);
154
155
156 // This is the point where the entire marking should have completed.
157 assert(GenMarkSweep::_marking_stack.is_empty(), "Marking should have completed");
158
159 // Unload classes and purge the SystemDictionary.
160 bool purged_class = SystemDictionary::do_unloading(&GenMarkSweep::is_alive);
161
162 // Unload nmethods.
163 CodeCache::do_unloading(&GenMarkSweep::is_alive, purged_class);
209 }
210
211 class G1AdjustPointersClosure: public HeapRegionClosure {
212 public:
213 bool doHeapRegion(HeapRegion* r) {
214 if (r->isHumongous()) {
215 if (r->startsHumongous()) {
216 // We must adjust the pointers on the single H object.
217 oop obj = oop(r->bottom());
218 // point all the oops to the new location
219 obj->adjust_pointers();
220 }
221 } else {
222 // This really ought to be "as_CompactibleSpace"...
223 r->adjust_pointers();
224 }
225 return false;
226 }
227 };
228
229 void G1MarkSweep::mark_sweep_phase3() {
230 G1CollectedHeap* g1h = G1CollectedHeap::heap();
231
232 // Adjust the pointers to reflect the new locations
233 GCTraceTime tm("phase 3", G1Log::fine() && Verbose, true, gc_timer(), gc_tracer()->gc_id());
234 GenMarkSweep::trace("3");
235
236 SharedHeap* sh = SharedHeap::heap();
237
238 // Need cleared claim bits for the roots processing
239 ClassLoaderDataGraph::clear_claimed_marks();
240
241 CodeBlobToOopClosure adjust_code_closure(&GenMarkSweep::adjust_pointer_closure, CodeBlobToOopClosure::FixRelocations);
242 sh->process_all_roots(true, // activate StrongRootsScope
243 SharedHeap::SO_AllCodeCache,
244 &GenMarkSweep::adjust_pointer_closure,
245 &GenMarkSweep::adjust_cld_closure,
246 &adjust_code_closure);
247
248 assert(GenMarkSweep::ref_processor() == g1h->ref_processor_stw(), "Sanity");
249 g1h->ref_processor_stw()->weak_oops_do(&GenMarkSweep::adjust_pointer_closure);
250
251 // Now adjust pointers in remaining weak roots. (All of which should
252 // have been cleared if they pointed to non-surviving objects.)
253 sh->process_weak_roots(&GenMarkSweep::adjust_pointer_closure);
254
255 if (G1StringDedup::is_enabled()) {
256 G1StringDedup::oops_do(&GenMarkSweep::adjust_pointer_closure);
257 }
258
259 GenMarkSweep::adjust_marks();
260
261 G1AdjustPointersClosure blk;
262 g1h->heap_region_iterate(&blk);
263 }
264
265 class G1SpaceCompactClosure: public HeapRegionClosure {
266 public:
267 G1SpaceCompactClosure() {}
268
269 bool doHeapRegion(HeapRegion* hr) {
270 if (hr->isHumongous()) {
271 if (hr->startsHumongous()) {
272 oop obj = oop(hr->bottom());
273 if (obj->is_gc_marked()) {
|
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 #include "precompiled.hpp"
26 #include "classfile/javaClasses.hpp"
27 #include "classfile/symbolTable.hpp"
28 #include "classfile/systemDictionary.hpp"
29 #include "classfile/vmSymbols.hpp"
30 #include "code/codeCache.hpp"
31 #include "code/icBuffer.hpp"
32 #include "gc_implementation/g1/g1Log.hpp"
33 #include "gc_implementation/g1/g1MarkSweep.hpp"
34 #include "gc_implementation/g1/g1RootProcessor.hpp"
35 #include "gc_implementation/g1/g1StringDedup.hpp"
36 #include "gc_implementation/shared/gcHeapSummary.hpp"
37 #include "gc_implementation/shared/gcTimer.hpp"
38 #include "gc_implementation/shared/gcTrace.hpp"
39 #include "gc_implementation/shared/gcTraceTime.hpp"
40 #include "memory/gcLocker.hpp"
41 #include "memory/genCollectedHeap.hpp"
42 #include "memory/modRefBarrierSet.hpp"
43 #include "memory/referencePolicy.hpp"
44 #include "memory/space.hpp"
45 #include "oops/instanceRefKlass.hpp"
46 #include "oops/oop.inline.hpp"
47 #include "prims/jvmtiExport.hpp"
48 #include "runtime/biasedLocking.hpp"
49 #include "runtime/fprofiler.hpp"
50 #include "runtime/synchronizer.hpp"
51 #include "runtime/thread.hpp"
52 #include "runtime/vmThread.hpp"
53 #include "utilities/copy.hpp"
54 #include "utilities/events.hpp"
110 CodeCache::gc_epilogue();
111 JvmtiExport::gc_epilogue();
112
113 // refs processing: clean slate
114 GenMarkSweep::_ref_processor = NULL;
115 }
116
117
118 void G1MarkSweep::allocate_stacks() {
119 GenMarkSweep::_preserved_count_max = 0;
120 GenMarkSweep::_preserved_marks = NULL;
121 GenMarkSweep::_preserved_count = 0;
122 }
123
124 void G1MarkSweep::mark_sweep_phase1(bool& marked_for_unloading,
125 bool clear_all_softrefs) {
126 // Recursively traverse all live objects and mark them
127 GCTraceTime tm("phase 1", G1Log::fine() && Verbose, true, gc_timer(), gc_tracer()->gc_id());
128 GenMarkSweep::trace(" 1");
129
130 G1CollectedHeap* g1h = G1CollectedHeap::heap();
131
132 // Need cleared claim bits for the roots processing
133 ClassLoaderDataGraph::clear_claimed_marks();
134
135 MarkingCodeBlobClosure follow_code_closure(&GenMarkSweep::follow_root_closure, !CodeBlobToOopClosure::FixRelocations);
136 {
137 G1RootProcessor root_processor(g1h);
138 root_processor.process_strong_roots(&GenMarkSweep::follow_root_closure,
139 &GenMarkSweep::follow_cld_closure,
140 &follow_code_closure);
141 }
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()->gc_id());
155 gc_tracer()->report_gc_reference_stats(stats);
156
157
158 // This is the point where the entire marking should have completed.
159 assert(GenMarkSweep::_marking_stack.is_empty(), "Marking should have completed");
160
161 // Unload classes and purge the SystemDictionary.
162 bool purged_class = SystemDictionary::do_unloading(&GenMarkSweep::is_alive);
163
164 // Unload nmethods.
165 CodeCache::do_unloading(&GenMarkSweep::is_alive, purged_class);
211 }
212
213 class G1AdjustPointersClosure: public HeapRegionClosure {
214 public:
215 bool doHeapRegion(HeapRegion* r) {
216 if (r->isHumongous()) {
217 if (r->startsHumongous()) {
218 // We must adjust the pointers on the single H object.
219 oop obj = oop(r->bottom());
220 // point all the oops to the new location
221 obj->adjust_pointers();
222 }
223 } else {
224 // This really ought to be "as_CompactibleSpace"...
225 r->adjust_pointers();
226 }
227 return false;
228 }
229 };
230
231 class G1AlwaysTrueClosure: public BoolObjectClosure {
232 public:
233 bool do_object_b(oop p) { return true; }
234 };
235 static G1AlwaysTrueClosure always_true;
236
237 void G1MarkSweep::mark_sweep_phase3() {
238 G1CollectedHeap* g1h = G1CollectedHeap::heap();
239
240 // Adjust the pointers to reflect the new locations
241 GCTraceTime tm("phase 3", G1Log::fine() && Verbose, true, gc_timer(), gc_tracer()->gc_id());
242 GenMarkSweep::trace("3");
243
244 // Need cleared claim bits for the roots processing
245 ClassLoaderDataGraph::clear_claimed_marks();
246
247 CodeBlobToOopClosure adjust_code_closure(&GenMarkSweep::adjust_pointer_closure, CodeBlobToOopClosure::FixRelocations);
248 {
249 G1RootProcessor root_processor(g1h);
250 root_processor.process_all_roots(&GenMarkSweep::adjust_pointer_closure,
251 &GenMarkSweep::adjust_cld_closure,
252 &adjust_code_closure);
253 }
254
255 assert(GenMarkSweep::ref_processor() == g1h->ref_processor_stw(), "Sanity");
256 g1h->ref_processor_stw()->weak_oops_do(&GenMarkSweep::adjust_pointer_closure);
257
258 // Now adjust pointers in remaining weak roots. (All of which should
259 // have been cleared if they pointed to non-surviving objects.)
260 JNIHandles::weak_oops_do(&always_true, &GenMarkSweep::adjust_pointer_closure);
261
262 if (G1StringDedup::is_enabled()) {
263 G1StringDedup::oops_do(&GenMarkSweep::adjust_pointer_closure);
264 }
265
266 GenMarkSweep::adjust_marks();
267
268 G1AdjustPointersClosure blk;
269 g1h->heap_region_iterate(&blk);
270 }
271
272 class G1SpaceCompactClosure: public HeapRegionClosure {
273 public:
274 G1SpaceCompactClosure() {}
275
276 bool doHeapRegion(HeapRegion* hr) {
277 if (hr->isHumongous()) {
278 if (hr->startsHumongous()) {
279 oop obj = oop(hr->bottom());
280 if (obj->is_gc_marked()) {
|