30 #include "gc/parallel/parallelScavengeHeap.hpp" |
30 #include "gc/parallel/parallelScavengeHeap.hpp" |
31 #include "gc/parallel/psCompactionManager.inline.hpp" |
31 #include "gc/parallel/psCompactionManager.inline.hpp" |
32 #include "gc/parallel/psOldGen.hpp" |
32 #include "gc/parallel/psOldGen.hpp" |
33 #include "gc/parallel/psParallelCompact.inline.hpp" |
33 #include "gc/parallel/psParallelCompact.inline.hpp" |
34 #include "gc/shared/taskqueue.inline.hpp" |
34 #include "gc/shared/taskqueue.inline.hpp" |
|
35 #include "logging/log.hpp" |
35 #include "memory/iterator.inline.hpp" |
36 #include "memory/iterator.inline.hpp" |
36 #include "oops/instanceKlass.inline.hpp" |
37 #include "oops/instanceKlass.inline.hpp" |
37 #include "oops/instanceMirrorKlass.inline.hpp" |
38 #include "oops/instanceMirrorKlass.inline.hpp" |
38 #include "oops/objArrayKlass.inline.hpp" |
39 #include "oops/objArrayKlass.inline.hpp" |
39 #include "oops/oop.inline.hpp" |
40 #include "oops/oop.inline.hpp" |
227 |
228 |
228 template <class T> |
229 template <class T> |
229 static void oop_pc_follow_contents_specialized(InstanceRefKlass* klass, oop obj, ParCompactionManager* cm) { |
230 static void oop_pc_follow_contents_specialized(InstanceRefKlass* klass, oop obj, ParCompactionManager* cm) { |
230 T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj); |
231 T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj); |
231 T heap_oop = oopDesc::load_heap_oop(referent_addr); |
232 T heap_oop = oopDesc::load_heap_oop(referent_addr); |
232 debug_only( |
233 log_develop_trace(gc, ref)("InstanceRefKlass::oop_pc_follow_contents " PTR_FORMAT, p2i(obj)); |
233 if(TraceReferenceGC && PrintGCDetails) { |
|
234 gclog_or_tty->print_cr("InstanceRefKlass::oop_pc_follow_contents " PTR_FORMAT, p2i(obj)); |
|
235 } |
|
236 ) |
|
237 if (!oopDesc::is_null(heap_oop)) { |
234 if (!oopDesc::is_null(heap_oop)) { |
238 oop referent = oopDesc::decode_heap_oop_not_null(heap_oop); |
235 oop referent = oopDesc::decode_heap_oop_not_null(heap_oop); |
239 if (PSParallelCompact::mark_bitmap()->is_unmarked(referent) && |
236 if (PSParallelCompact::mark_bitmap()->is_unmarked(referent) && |
240 PSParallelCompact::ref_processor()->discover_reference(obj, klass->reference_type())) { |
237 PSParallelCompact::ref_processor()->discover_reference(obj, klass->reference_type())) { |
241 // reference already enqueued, referent will be traversed later |
238 // reference already enqueued, referent will be traversed later |
242 klass->InstanceKlass::oop_pc_follow_contents(obj, cm); |
239 klass->InstanceKlass::oop_pc_follow_contents(obj, cm); |
243 debug_only( |
240 log_develop_trace(gc, ref)(" Non NULL enqueued " PTR_FORMAT, p2i(obj)); |
244 if(TraceReferenceGC && PrintGCDetails) { |
|
245 gclog_or_tty->print_cr(" Non NULL enqueued " PTR_FORMAT, p2i(obj)); |
|
246 } |
|
247 ) |
|
248 return; |
241 return; |
249 } else { |
242 } else { |
250 // treat referent as normal oop |
243 // treat referent as normal oop |
251 debug_only( |
244 log_develop_trace(gc, ref)(" Non NULL normal " PTR_FORMAT, p2i(obj)); |
252 if(TraceReferenceGC && PrintGCDetails) { |
|
253 gclog_or_tty->print_cr(" Non NULL normal " PTR_FORMAT, p2i(obj)); |
|
254 } |
|
255 ) |
|
256 cm->mark_and_push(referent_addr); |
245 cm->mark_and_push(referent_addr); |
257 } |
246 } |
258 } |
247 } |
259 T* next_addr = (T*)java_lang_ref_Reference::next_addr(obj); |
248 T* next_addr = (T*)java_lang_ref_Reference::next_addr(obj); |
260 // Treat discovered as normal oop, if ref is not "active", |
249 // Treat discovered as normal oop, if ref is not "active", |
261 // i.e. if next is non-NULL. |
250 // i.e. if next is non-NULL. |
262 T next_oop = oopDesc::load_heap_oop(next_addr); |
251 T next_oop = oopDesc::load_heap_oop(next_addr); |
263 if (!oopDesc::is_null(next_oop)) { // i.e. ref is not "active" |
252 if (!oopDesc::is_null(next_oop)) { // i.e. ref is not "active" |
264 T* discovered_addr = (T*)java_lang_ref_Reference::discovered_addr(obj); |
253 T* discovered_addr = (T*)java_lang_ref_Reference::discovered_addr(obj); |
265 debug_only( |
254 log_develop_trace(gc, ref)(" Process discovered as normal " PTR_FORMAT, p2i(discovered_addr)); |
266 if(TraceReferenceGC && PrintGCDetails) { |
|
267 gclog_or_tty->print_cr(" Process discovered as normal " |
|
268 PTR_FORMAT, p2i(discovered_addr)); |
|
269 } |
|
270 ) |
|
271 cm->mark_and_push(discovered_addr); |
255 cm->mark_and_push(discovered_addr); |
272 } |
256 } |
273 cm->mark_and_push(next_addr); |
257 cm->mark_and_push(next_addr); |
274 klass->InstanceKlass::oop_pc_follow_contents(obj, cm); |
258 klass->InstanceKlass::oop_pc_follow_contents(obj, cm); |
275 } |
259 } |