< prev index next >

src/hotspot/share/gc/parallel/psCompactionManager.cpp

Print this page




 166       cm->follow_klass(klass);
 167     }
 168   } else {
 169     // If klass is NULL then this a mirror for a primitive type.
 170     // We don't have to follow them, since they are handled as strong
 171     // roots in Universe::oops_do.
 172     assert(java_lang_Class::is_primitive(obj), "Sanity check");
 173   }
 174 
 175   ParCompactionManager::MarkAndPushClosure cl(cm);
 176   if (UseCompressedOops) {
 177     oop_oop_iterate_statics<narrowOop>(obj, &cl);
 178   } else {
 179     oop_oop_iterate_statics<oop>(obj, &cl);
 180   }
 181 }
 182 
 183 void InstanceClassLoaderKlass::oop_pc_follow_contents(oop obj, ParCompactionManager* cm) {
 184   InstanceKlass::oop_pc_follow_contents(obj, cm);
 185 
 186   ClassLoaderData * const loader_data = java_lang_ClassLoader::loader_data(obj);
 187   if (loader_data != NULL) {
 188     cm->follow_class_loader(loader_data);
 189   }
 190 }
 191 
 192 template <class T>
 193 static void oop_pc_follow_contents_specialized(InstanceRefKlass* klass, oop obj, ParCompactionManager* cm) {
 194   T* referent_addr = (T*)java_lang_ref_Reference::referent_addr_raw(obj);
 195   T heap_oop = RawAccess<>::oop_load(referent_addr);
 196   log_develop_trace(gc, ref)("InstanceRefKlass::oop_pc_follow_contents " PTR_FORMAT, p2i(obj));
 197   if (!CompressedOops::is_null(heap_oop)) {
 198     oop referent = CompressedOops::decode_not_null(heap_oop);
 199     if (PSParallelCompact::mark_bitmap()->is_unmarked(referent) &&
 200         PSParallelCompact::ref_processor()->discover_reference(obj, klass->reference_type())) {
 201       // reference already enqueued, referent will be traversed later
 202       klass->InstanceKlass::oop_pc_follow_contents(obj, cm);
 203       log_develop_trace(gc, ref)("       Non NULL enqueued " PTR_FORMAT, p2i(obj));
 204       return;
 205     } else {
 206       // treat referent as normal oop




 166       cm->follow_klass(klass);
 167     }
 168   } else {
 169     // If klass is NULL then this a mirror for a primitive type.
 170     // We don't have to follow them, since they are handled as strong
 171     // roots in Universe::oops_do.
 172     assert(java_lang_Class::is_primitive(obj), "Sanity check");
 173   }
 174 
 175   ParCompactionManager::MarkAndPushClosure cl(cm);
 176   if (UseCompressedOops) {
 177     oop_oop_iterate_statics<narrowOop>(obj, &cl);
 178   } else {
 179     oop_oop_iterate_statics<oop>(obj, &cl);
 180   }
 181 }
 182 
 183 void InstanceClassLoaderKlass::oop_pc_follow_contents(oop obj, ParCompactionManager* cm) {
 184   InstanceKlass::oop_pc_follow_contents(obj, cm);
 185 
 186   ClassLoaderData * const loader_data = java_lang_ClassLoader::loader_data_acquire(obj);
 187   if (loader_data != NULL) {
 188     cm->follow_class_loader(loader_data);
 189   }
 190 }
 191 
 192 template <class T>
 193 static void oop_pc_follow_contents_specialized(InstanceRefKlass* klass, oop obj, ParCompactionManager* cm) {
 194   T* referent_addr = (T*)java_lang_ref_Reference::referent_addr_raw(obj);
 195   T heap_oop = RawAccess<>::oop_load(referent_addr);
 196   log_develop_trace(gc, ref)("InstanceRefKlass::oop_pc_follow_contents " PTR_FORMAT, p2i(obj));
 197   if (!CompressedOops::is_null(heap_oop)) {
 198     oop referent = CompressedOops::decode_not_null(heap_oop);
 199     if (PSParallelCompact::mark_bitmap()->is_unmarked(referent) &&
 200         PSParallelCompact::ref_processor()->discover_reference(obj, klass->reference_type())) {
 201       // reference already enqueued, referent will be traversed later
 202       klass->InstanceKlass::oop_pc_follow_contents(obj, cm);
 203       log_develop_trace(gc, ref)("       Non NULL enqueued " PTR_FORMAT, p2i(obj));
 204       return;
 205     } else {
 206       // treat referent as normal oop


< prev index next >