< prev index next >

src/share/vm/gc_implementation/shared/markSweep.inline.hpp

Print this page




  41     // We must enqueue the object before it is marked
  42     // as we otherwise can't read the object's age.
  43     G1StringDedup::enqueue_from_mark(obj);
  44   }
  45 #endif
  46   // some marks may contain information we need to preserve so we store them away
  47   // and overwrite the mark.  We'll restore it at the end of markSweep.
  48   markOop mark = obj->mark();
  49   obj->set_mark(markOopDesc::prototype()->set_marked());
  50 
  51   if (mark->must_be_preserved(obj)) {
  52     preserve_mark(obj, mark);
  53   }
  54 }
  55 
  56 inline void MarkSweep::follow_klass(Klass* klass) {
  57   oop op = klass->klass_holder();
  58   MarkSweep::mark_and_push(&op);
  59 }
  60 




  61 template <class T> inline void MarkSweep::follow_root(T* p) {
  62   assert(!Universe::heap()->is_in_reserved(p),
  63          "roots shouldn't be things within the heap");
  64   T heap_oop = oopDesc::load_heap_oop(p);
  65   if (!oopDesc::is_null(heap_oop)) {
  66     oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
  67     if (!obj->mark()->is_marked()) {
  68       mark_object(obj);
  69       obj->follow_contents();
  70     }
  71   }
  72   follow_stack();
  73 }
  74 
  75 template <class T> inline void MarkSweep::mark_and_push(T* p) {
  76 //  assert(Universe::heap()->is_in_reserved(p), "should be in object space");
  77   T heap_oop = oopDesc::load_heap_oop(p);
  78   if (!oopDesc::is_null(heap_oop)) {
  79     oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
  80     if (!obj->mark()->is_marked()) {
  81       mark_object(obj);
  82       _marking_stack.push(obj);
  83     }
  84   }
  85 }
  86 
  87 void MarkSweep::push_objarray(oop obj, size_t index) {
  88   ObjArrayTask task(obj, index);
  89   assert(task.is_valid(), "bad ObjArrayTask");
  90   _objarray_stack.push(task);




  91 }
  92 
  93 template <class T> inline void MarkSweep::adjust_pointer(T* p) {
  94   T heap_oop = oopDesc::load_heap_oop(p);
  95   if (!oopDesc::is_null(heap_oop)) {
  96     oop obj     = oopDesc::decode_heap_oop_not_null(heap_oop);
  97     oop new_obj = oop(obj->mark()->decode_pointer());
  98     assert(new_obj != NULL ||                         // is forwarding ptr?
  99            obj->mark() == markOopDesc::prototype() || // not gc marked?
 100            (UseBiasedLocking && obj->mark()->has_bias_pattern()),
 101                                                       // not gc marked?
 102            "should be forwarded");
 103     if (new_obj != NULL) {
 104       assert(Universe::heap()->is_in_reserved(new_obj),
 105              "should be in object space");
 106       oopDesc::encode_store_heap_oop_not_null(p, new_obj);
 107     }
 108   }
 109 }
 110 


  41     // We must enqueue the object before it is marked
  42     // as we otherwise can't read the object's age.
  43     G1StringDedup::enqueue_from_mark(obj);
  44   }
  45 #endif
  46   // some marks may contain information we need to preserve so we store them away
  47   // and overwrite the mark.  We'll restore it at the end of markSweep.
  48   markOop mark = obj->mark();
  49   obj->set_mark(markOopDesc::prototype()->set_marked());
  50 
  51   if (mark->must_be_preserved(obj)) {
  52     preserve_mark(obj, mark);
  53   }
  54 }
  55 
  56 inline void MarkSweep::follow_klass(Klass* klass) {
  57   oop op = klass->klass_holder();
  58   MarkSweep::mark_and_push(&op);
  59 }
  60 
  61 inline void MarkSweep::follow_object(oop obj) {
  62   obj->follow_contents();
  63 }
  64 
  65 template <class T> inline void MarkSweep::follow_root(T* p) {
  66   assert(!Universe::heap()->is_in_reserved(p),
  67          "roots shouldn't be things within the heap");
  68   T heap_oop = oopDesc::load_heap_oop(p);
  69   if (!oopDesc::is_null(heap_oop)) {
  70     oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
  71     if (!obj->mark()->is_marked()) {
  72       mark_object(obj);
  73       obj->follow_contents();
  74     }
  75   }
  76   follow_stack();
  77 }
  78 
  79 template <class T> inline void MarkSweep::mark_and_push(T* p) {
  80 //  assert(Universe::heap()->is_in_reserved(p), "should be in object space");
  81   T heap_oop = oopDesc::load_heap_oop(p);
  82   if (!oopDesc::is_null(heap_oop)) {
  83     oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
  84     if (!obj->mark()->is_marked()) {
  85       mark_object(obj);
  86       _marking_stack.push(obj);
  87     }
  88   }
  89 }
  90 
  91 void MarkSweep::push_objarray(oop obj, size_t index) {
  92   ObjArrayTask task(obj, index);
  93   assert(task.is_valid(), "bad ObjArrayTask");
  94   _objarray_stack.push(task);
  95 }
  96 
  97 inline int MarkSweep::adjust_pointers(oop obj) {
  98   return obj->adjust_pointers();
  99 }
 100 
 101 template <class T> inline void MarkSweep::adjust_pointer(T* p) {
 102   T heap_oop = oopDesc::load_heap_oop(p);
 103   if (!oopDesc::is_null(heap_oop)) {
 104     oop obj     = oopDesc::decode_heap_oop_not_null(heap_oop);
 105     oop new_obj = oop(obj->mark()->decode_pointer());
 106     assert(new_obj != NULL ||                         // is forwarding ptr?
 107            obj->mark() == markOopDesc::prototype() || // not gc marked?
 108            (UseBiasedLocking && obj->mark()->has_bias_pattern()),
 109                                                       // not gc marked?
 110            "should be forwarded");
 111     if (new_obj != NULL) {
 112       assert(Universe::heap()->is_in_reserved(new_obj),
 113              "should be in object space");
 114       oopDesc::encode_store_heap_oop_not_null(p, new_obj);
 115     }
 116   }
 117 }
 118 
< prev index next >