< prev index next >

src/share/vm/gc/serial/markSweep.cpp

Print this page




 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();
< prev index next >