hotspot/src/share/vm/gc/serial/markSweep.inline.hpp
changeset 31346 a70d45c06136
parent 30764 fec48bf5a827
child 32606 fdaa30d06ada
equal deleted inserted replaced
31345:1bba15125d8d 31346:a70d45c06136
    35 #include "oops/objArrayKlass.inline.hpp"
    35 #include "oops/objArrayKlass.inline.hpp"
    36 #include "utilities/macros.hpp"
    36 #include "utilities/macros.hpp"
    37 #include "utilities/stack.inline.hpp"
    37 #include "utilities/stack.inline.hpp"
    38 #if INCLUDE_ALL_GCS
    38 #if INCLUDE_ALL_GCS
    39 #include "gc/g1/g1StringDedup.hpp"
    39 #include "gc/g1/g1StringDedup.hpp"
       
    40 #include "gc/g1/g1MarkSweep.hpp"
    40 #endif // INCLUDE_ALL_GCS
    41 #endif // INCLUDE_ALL_GCS
    41 
    42 
    42 inline void MarkSweep::mark_object(oop obj) {
    43 inline void MarkSweep::mark_object(oop obj) {
    43 #if INCLUDE_ALL_GCS
    44 #if INCLUDE_ALL_GCS
    44   if (G1StringDedup::is_enabled()) {
    45   if (G1StringDedup::is_enabled()) {
    55   if (mark->must_be_preserved(obj)) {
    56   if (mark->must_be_preserved(obj)) {
    56     preserve_mark(obj, mark);
    57     preserve_mark(obj, mark);
    57   }
    58   }
    58 }
    59 }
    59 
    60 
       
    61 inline bool MarkSweep::is_archive_object(oop object) {
       
    62 #if INCLUDE_ALL_GCS
       
    63   return (G1MarkSweep::archive_check_enabled() &&
       
    64           G1MarkSweep::in_archive_range(object));
       
    65 #else
       
    66   return false;
       
    67 #endif
       
    68 }
       
    69 
    60 inline void MarkSweep::follow_klass(Klass* klass) {
    70 inline void MarkSweep::follow_klass(Klass* klass) {
    61   oop op = klass->klass_holder();
    71   oop op = klass->klass_holder();
    62   MarkSweep::mark_and_push(&op);
    72   MarkSweep::mark_and_push(&op);
    63 }
    73 }
    64 
    74 
    72   assert(!Universe::heap()->is_in_reserved(p),
    82   assert(!Universe::heap()->is_in_reserved(p),
    73          "roots shouldn't be things within the heap");
    83          "roots shouldn't be things within the heap");
    74   T heap_oop = oopDesc::load_heap_oop(p);
    84   T heap_oop = oopDesc::load_heap_oop(p);
    75   if (!oopDesc::is_null(heap_oop)) {
    85   if (!oopDesc::is_null(heap_oop)) {
    76     oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
    86     oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
    77     if (!obj->mark()->is_marked()) {
    87     if (!obj->mark()->is_marked() &&
       
    88         !is_archive_object(obj)) {
    78       mark_object(obj);
    89       mark_object(obj);
    79       follow_object(obj);
    90       follow_object(obj);
    80     }
    91     }
    81   }
    92   }
    82   follow_stack();
    93   follow_stack();
    85 template <class T> inline void MarkSweep::mark_and_push(T* p) {
    96 template <class T> inline void MarkSweep::mark_and_push(T* p) {
    86 //  assert(Universe::heap()->is_in_reserved(p), "should be in object space");
    97 //  assert(Universe::heap()->is_in_reserved(p), "should be in object space");
    87   T heap_oop = oopDesc::load_heap_oop(p);
    98   T heap_oop = oopDesc::load_heap_oop(p);
    88   if (!oopDesc::is_null(heap_oop)) {
    99   if (!oopDesc::is_null(heap_oop)) {
    89     oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
   100     oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
    90     if (!obj->mark()->is_marked()) {
   101     if (!obj->mark()->is_marked() &&
       
   102         !is_archive_object(obj)) {
    91       mark_object(obj);
   103       mark_object(obj);
    92       _marking_stack.push(obj);
   104       _marking_stack.push(obj);
    93     }
   105     }
    94   }
   106   }
    95 }
   107 }
   109   if (!oopDesc::is_null(heap_oop)) {
   121   if (!oopDesc::is_null(heap_oop)) {
   110     oop obj     = oopDesc::decode_heap_oop_not_null(heap_oop);
   122     oop obj     = oopDesc::decode_heap_oop_not_null(heap_oop);
   111     assert(Universe::heap()->is_in(obj), "should be in heap");
   123     assert(Universe::heap()->is_in(obj), "should be in heap");
   112 
   124 
   113     oop new_obj = oop(obj->mark()->decode_pointer());
   125     oop new_obj = oop(obj->mark()->decode_pointer());
   114     assert(new_obj != NULL ||                         // is forwarding ptr?
   126     assert(is_archive_object(obj) ||                  // no forwarding of archive objects
       
   127            new_obj != NULL ||                         // is forwarding ptr?
   115            obj->mark() == markOopDesc::prototype() || // not gc marked?
   128            obj->mark() == markOopDesc::prototype() || // not gc marked?
   116            (UseBiasedLocking && obj->mark()->has_bias_pattern()),
   129            (UseBiasedLocking && obj->mark()->has_bias_pattern()),
   117                                                       // not gc marked?
   130            // not gc marked?
   118            "should be forwarded");
   131            "should be forwarded");
   119     if (new_obj != NULL) {
   132     if (new_obj != NULL) {
   120       assert(Universe::heap()->is_in_reserved(new_obj),
   133       if (!is_archive_object(obj)) {
   121              "should be in object space");
   134         assert(Universe::heap()->is_in_reserved(new_obj),
   122       oopDesc::encode_store_heap_oop_not_null(p, new_obj);
   135               "should be in object space");
       
   136         oopDesc::encode_store_heap_oop_not_null(p, new_obj);
       
   137       }
   123     }
   138     }
   124   }
   139   }
   125 }
   140 }
   126 
   141 
   127 template <class T> inline void MarkSweep::KeepAliveClosure::do_oop_work(T* p) {
   142 template <class T> inline void MarkSweep::KeepAliveClosure::do_oop_work(T* p) {