Mercurial > hg > graal-jvmci-8
comparison src/share/vm/gc_implementation/g1/g1OopClosures.inline.hpp @ 20305:755930f931e3
8027959: Early reclamation of large objects in G1
Summary: Try to reclaim humongous objects at every young collection after doing a conservative estimate of its liveness.
Reviewed-by: brutisso, mgerdin
author | tschatzl |
---|---|
date | Wed, 23 Jul 2014 09:03:32 +0200 |
parents | 2c6ef90f030a |
children | eec72fa4b108 |
comparison
equal
deleted
inserted
replaced
20304:a22acf6d7598 | 20305:755930f931e3 |
---|---|
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> |