equal
deleted
inserted
replaced
42 |
42 |
43 template <class T> |
43 template <class T> |
44 inline void FilterIntoCSClosure::do_oop_nv(T* p) { |
44 inline void FilterIntoCSClosure::do_oop_nv(T* p) { |
45 T heap_oop = oopDesc::load_heap_oop(p); |
45 T heap_oop = oopDesc::load_heap_oop(p); |
46 if (!oopDesc::is_null(heap_oop) && |
46 if (!oopDesc::is_null(heap_oop) && |
47 _g1->obj_in_cs(oopDesc::decode_heap_oop_not_null(heap_oop))) { |
47 _g1->is_in_cset_or_humongous(oopDesc::decode_heap_oop_not_null(heap_oop))) { |
48 _oc->do_oop(p); |
48 _oc->do_oop(p); |
49 } |
49 } |
50 } |
50 } |
51 |
51 |
52 template <class T> |
52 template <class T> |
65 inline void G1ParScanClosure::do_oop_nv(T* p) { |
65 inline void G1ParScanClosure::do_oop_nv(T* p) { |
66 T heap_oop = oopDesc::load_heap_oop(p); |
66 T heap_oop = oopDesc::load_heap_oop(p); |
67 |
67 |
68 if (!oopDesc::is_null(heap_oop)) { |
68 if (!oopDesc::is_null(heap_oop)) { |
69 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); |
69 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); |
70 if (_g1->in_cset_fast_test(obj)) { |
70 G1CollectedHeap::in_cset_state_t state = _g1->in_cset_state(obj); |
|
71 if (state == G1CollectedHeap::InCSet) { |
71 // We're not going to even bother checking whether the object is |
72 // We're not going to even bother checking whether the object is |
72 // already forwarded or not, as this usually causes an immediate |
73 // already forwarded or not, as this usually causes an immediate |
73 // stall. We'll try to prefetch the object (for write, given that |
74 // stall. We'll try to prefetch the object (for write, given that |
74 // we might need to install the forwarding reference) and we'll |
75 // we might need to install the forwarding reference) and we'll |
75 // get back to it when pop it from the queue |
76 // get back to it when pop it from the queue |
84 obj->forwardee() == oopDesc::load_decode_heap_oop(p)), |
85 obj->forwardee() == oopDesc::load_decode_heap_oop(p)), |
85 "p should still be pointing to obj or to its forwardee"); |
86 "p should still be pointing to obj or to its forwardee"); |
86 |
87 |
87 _par_scan_state->push_on_queue(p); |
88 _par_scan_state->push_on_queue(p); |
88 } else { |
89 } else { |
|
90 if (state == G1CollectedHeap::IsHumongous) { |
|
91 _g1->set_humongous_is_live(obj); |
|
92 } |
89 _par_scan_state->update_rs(_from, p, _worker_id); |
93 _par_scan_state->update_rs(_from, p, _worker_id); |
90 } |
94 } |
91 } |
95 } |
92 } |
96 } |
93 |
97 |
95 inline void G1ParPushHeapRSClosure::do_oop_nv(T* p) { |
99 inline void G1ParPushHeapRSClosure::do_oop_nv(T* p) { |
96 T heap_oop = oopDesc::load_heap_oop(p); |
100 T heap_oop = oopDesc::load_heap_oop(p); |
97 |
101 |
98 if (!oopDesc::is_null(heap_oop)) { |
102 if (!oopDesc::is_null(heap_oop)) { |
99 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); |
103 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); |
100 if (_g1->in_cset_fast_test(obj)) { |
104 if (_g1->is_in_cset_or_humongous(obj)) { |
101 Prefetch::write(obj->mark_addr(), 0); |
105 Prefetch::write(obj->mark_addr(), 0); |
102 Prefetch::read(obj->mark_addr(), (HeapWordSize*2)); |
106 Prefetch::read(obj->mark_addr(), (HeapWordSize*2)); |
103 |
107 |
104 // Place on the references queue |
108 // Place on the references queue |
105 _par_scan_state->push_on_queue(p); |
109 _par_scan_state->push_on_queue(p); |
|
110 } else { |
|
111 assert(!_g1->obj_in_cs(obj), "checking"); |
106 } |
112 } |
107 } |
113 } |
108 } |
114 } |
109 |
115 |
110 template <class T> |
116 template <class T> |