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
|