285 int InstanceKlass::oop_ms_adjust_pointers(oop obj) { 286 int size = size_helper(); 287 oop_oop_iterate_oop_maps<true>(obj, &MarkSweep::adjust_pointer_closure); 288 return size; 289 } 290 291 int InstanceMirrorKlass::oop_ms_adjust_pointers(oop obj) { 292 int size = oop_size(obj); 293 InstanceKlass::oop_ms_adjust_pointers(obj); 294 295 oop_oop_iterate_statics<true>(obj, &MarkSweep::adjust_pointer_closure); 296 return size; 297 } 298 299 int InstanceClassLoaderKlass::oop_ms_adjust_pointers(oop obj) { 300 return InstanceKlass::oop_ms_adjust_pointers(obj); 301 } 302 303 #ifdef ASSERT 304 template <class T> static void trace_reference_gc(const char *s, oop obj, 305 T* referent_addr, 306 T* next_addr, 307 T* discovered_addr) { 308 if(TraceReferenceGC && PrintGCDetails) { 309 gclog_or_tty->print_cr("%s obj " PTR_FORMAT, s, p2i(obj)); 310 gclog_or_tty->print_cr(" referent_addr/* " PTR_FORMAT " / " 311 PTR_FORMAT, p2i(referent_addr), 312 p2i(referent_addr ? 313 (address)oopDesc::load_decode_heap_oop(referent_addr) : NULL)); 314 gclog_or_tty->print_cr(" next_addr/* " PTR_FORMAT " / " 315 PTR_FORMAT, p2i(next_addr), 316 p2i(next_addr ? (address)oopDesc::load_decode_heap_oop(next_addr) : NULL)); 317 gclog_or_tty->print_cr(" discovered_addr/* " PTR_FORMAT " / " 318 PTR_FORMAT, p2i(discovered_addr), 319 p2i(discovered_addr ? 320 (address)oopDesc::load_decode_heap_oop(discovered_addr) : NULL)); 321 } 322 } 323 #endif 324 325 template <class T> void static adjust_object_specialized(oop obj) { 326 T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj); 327 MarkSweep::adjust_pointer(referent_addr); 328 T* next_addr = (T*)java_lang_ref_Reference::next_addr(obj); 329 MarkSweep::adjust_pointer(next_addr); 330 T* discovered_addr = (T*)java_lang_ref_Reference::discovered_addr(obj); 331 MarkSweep::adjust_pointer(discovered_addr); 332 debug_only(trace_reference_gc("InstanceRefKlass::oop_ms_adjust_pointers", obj, 333 referent_addr, next_addr, discovered_addr);) 334 } 335 336 int InstanceRefKlass::oop_ms_adjust_pointers(oop obj) { 337 int size = size_helper(); 338 InstanceKlass::oop_ms_adjust_pointers(obj); 339 340 if (UseCompressedOops) { 341 adjust_object_specialized<narrowOop>(obj); 342 } else { 343 adjust_object_specialized<oop>(obj); 344 } 345 return size; 346 } 347 348 int ObjArrayKlass::oop_ms_adjust_pointers(oop obj) { 349 assert(obj->is_objArray(), "obj must be obj array"); 350 objArrayOop a = objArrayOop(obj); 351 // Get size before changing pointers. 352 // Don't call size() or oop_size() since that is a virtual call. 353 int size = a->object_size(); 354 oop_oop_iterate_elements<true>(a, &MarkSweep::adjust_pointer_closure); 355 return size; 356 } 357 358 int TypeArrayKlass::oop_ms_adjust_pointers(oop obj) { 359 assert(obj->is_typeArray(), "must be a type array"); 360 typeArrayOop t = typeArrayOop(obj); 361 // Performance tweak: We skip iterating over the klass pointer since we 362 // know that Universe::TypeArrayKlass never moves. 363 return t->object_size(); | 285 int InstanceKlass::oop_ms_adjust_pointers(oop obj) { 286 int size = size_helper(); 287 oop_oop_iterate_oop_maps<true>(obj, &MarkSweep::adjust_pointer_closure); 288 return size; 289 } 290 291 int InstanceMirrorKlass::oop_ms_adjust_pointers(oop obj) { 292 int size = oop_size(obj); 293 InstanceKlass::oop_ms_adjust_pointers(obj); 294 295 oop_oop_iterate_statics<true>(obj, &MarkSweep::adjust_pointer_closure); 296 return size; 297 } 298 299 int InstanceClassLoaderKlass::oop_ms_adjust_pointers(oop obj) { 300 return InstanceKlass::oop_ms_adjust_pointers(obj); 301 } 302 303 #ifdef ASSERT 304 template <class T> static void trace_reference_gc(const char *s, oop obj, 305 bool is_ephemeron, 306 T* referent_addr, 307 T* next_addr, 308 T* discovered_addr, 309 T* value_addr) { 310 if(TraceReferenceGC && PrintGCDetails) { 311 gclog_or_tty->print_cr("%s obj " PTR_FORMAT, s, p2i(obj)); 312 gclog_or_tty->print_cr(" referent_addr/* " PTR_FORMAT " / " 313 PTR_FORMAT, p2i(referent_addr), 314 p2i(referent_addr ? 315 (address)oopDesc::load_decode_heap_oop(referent_addr) : NULL)); 316 gclog_or_tty->print_cr(" next_addr/* " PTR_FORMAT " / " 317 PTR_FORMAT, p2i(next_addr), 318 p2i(next_addr ? (address)oopDesc::load_decode_heap_oop(next_addr) : NULL)); 319 gclog_or_tty->print_cr(" discovered_addr/* " PTR_FORMAT " / " 320 PTR_FORMAT, p2i(discovered_addr), 321 p2i(discovered_addr ? 322 (address)oopDesc::load_decode_heap_oop(discovered_addr) : NULL)); 323 if (is_ephemeron) { 324 gclog_or_tty->print_cr(" value_addr/* " PTR_FORMAT " / " 325 PTR_FORMAT, p2i(value_addr), 326 p2i(value_addr ? 327 (address)oopDesc::load_decode_heap_oop(value_addr) : NULL)); 328 } 329 } 330 } 331 #endif 332 333 template <class T> void static adjust_object_specialized(oop obj, InstanceRefKlass* klass) { 334 T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj); 335 MarkSweep::adjust_pointer(referent_addr); 336 T* next_addr = (T*)java_lang_ref_Reference::next_addr(obj); 337 MarkSweep::adjust_pointer(next_addr); 338 T* discovered_addr = (T*)java_lang_ref_Reference::discovered_addr(obj); 339 MarkSweep::adjust_pointer(discovered_addr); 340 if (klass->reference_type() == REF_EPHEMERON) { 341 T* value_addr = (T*) java_lang_ref_Ephemeron::value_addr(obj); 342 MarkSweep::adjust_pointer(value_addr); 343 debug_only(trace_reference_gc("InstanceRefKlass<Ephemeron>::oop_ms_adjust_pointers", obj, true, 344 referent_addr, next_addr, discovered_addr, value_addr);) 345 } else { 346 debug_only(trace_reference_gc("InstanceRefKlass::oop_ms_adjust_pointers", obj, false, 347 referent_addr, next_addr, discovered_addr, (T*)NULL);) 348 } 349 } 350 351 int InstanceRefKlass::oop_ms_adjust_pointers(oop obj) { 352 int size = size_helper(); 353 InstanceKlass::oop_ms_adjust_pointers(obj); 354 355 if (UseCompressedOops) { 356 adjust_object_specialized<narrowOop>(obj, this); 357 } else { 358 adjust_object_specialized<oop>(obj, this); 359 } 360 return size; 361 } 362 363 int ObjArrayKlass::oop_ms_adjust_pointers(oop obj) { 364 assert(obj->is_objArray(), "obj must be obj array"); 365 objArrayOop a = objArrayOop(obj); 366 // Get size before changing pointers. 367 // Don't call size() or oop_size() since that is a virtual call. 368 int size = a->object_size(); 369 oop_oop_iterate_elements<true>(a, &MarkSweep::adjust_pointer_closure); 370 return size; 371 } 372 373 int TypeArrayKlass::oop_ms_adjust_pointers(oop obj) { 374 assert(obj->is_typeArray(), "must be a type array"); 375 typeArrayOop t = typeArrayOop(obj); 376 // Performance tweak: We skip iterating over the klass pointer since we 377 // know that Universe::TypeArrayKlass never moves. 378 return t->object_size(); |