hotspot/src/share/vm/gc/parallel/psCompactionManager.cpp
changeset 35061 be6025ebffea
parent 33611 9abd65805e19
child 35877 a2a62511d0f8
equal deleted inserted replaced
35060:382d0689141c 35061:be6025ebffea
    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 }