Mercurial > hg > graal-jvmci-8
annotate src/share/vm/gc_implementation/g1/g1OopClosures.hpp @ 3979:4dfb2df418f2
6484982: G1: process references during evacuation pauses
Summary: G1 now uses two reference processors - one is used by concurrent marking and the other is used by STW GCs (both full and incremental evacuation pauses). In an evacuation pause, the reference processor is embedded into the closures used to scan objects. Doing so causes causes reference objects to be 'discovered' by the reference processor. At the end of the evacuation pause, these discovered reference objects are processed - preserving (and copying) referent objects (and their reachable graphs) as appropriate.
Reviewed-by: ysr, jwilhelm, brutisso, stefank, tonyp
author | johnc |
---|---|
date | Thu, 22 Sep 2011 10:57:37 -0700 |
parents | 663cb89032b1 |
children | 811ec3d0833b |
rev | line source |
---|---|
342 | 1 /* |
3765
ae5b2f1dcf12
7045662: G1: OopsInHeapRegionClosure::set_region() should not be virtual
tonyp
parents:
1972
diff
changeset
|
2 * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. |
342 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1261
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1261
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1261
diff
changeset
|
21 * questions. |
342 | 22 * |
23 */ | |
24 | |
1972 | 25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_G1OOPCLOSURES_HPP |
26 #define SHARE_VM_GC_IMPLEMENTATION_G1_G1OOPCLOSURES_HPP | |
27 | |
342 | 28 class HeapRegion; |
29 class G1CollectedHeap; | |
30 class G1RemSet; | |
31 class ConcurrentMark; | |
32 class DirtyCardToOopClosure; | |
33 class CMBitMap; | |
34 class CMMarkStack; | |
35 class G1ParScanThreadState; | |
3771 | 36 class CMTask; |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
37 class ReferenceProcessor; |
342 | 38 |
39 // A class that scans oops in a given heap region (much as OopsInGenClosure | |
40 // scans oops in a generation.) | |
41 class OopsInHeapRegionClosure: public OopsInGenClosure { | |
42 protected: | |
43 HeapRegion* _from; | |
44 public: | |
3765
ae5b2f1dcf12
7045662: G1: OopsInHeapRegionClosure::set_region() should not be virtual
tonyp
parents:
1972
diff
changeset
|
45 void set_region(HeapRegion* from) { _from = from; } |
342 | 46 }; |
47 | |
48 class G1ParClosureSuper : public OopsInHeapRegionClosure { | |
49 protected: | |
50 G1CollectedHeap* _g1; | |
51 G1RemSet* _g1_rem; | |
52 ConcurrentMark* _cm; | |
53 G1ParScanThreadState* _par_scan_state; | |
3886
eeae91c9baba
7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents:
3771
diff
changeset
|
54 bool _during_initial_mark; |
eeae91c9baba
7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents:
3771
diff
changeset
|
55 bool _mark_in_progress; |
342 | 56 public: |
57 G1ParClosureSuper(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state); | |
58 bool apply_to_weak_ref_discovered_field() { return true; } | |
59 }; | |
60 | |
1261 | 61 class G1ParPushHeapRSClosure : public G1ParClosureSuper { |
62 public: | |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
63 G1ParPushHeapRSClosure(G1CollectedHeap* g1, |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
64 G1ParScanThreadState* par_scan_state, |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
65 ReferenceProcessor* rp) : |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
66 G1ParClosureSuper(g1, par_scan_state) |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
67 { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
68 assert(_ref_processor == NULL, "sanity"); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
69 _ref_processor = rp; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
70 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
71 |
1261 | 72 template <class T> void do_oop_nv(T* p); |
73 virtual void do_oop(oop* p) { do_oop_nv(p); } | |
74 virtual void do_oop(narrowOop* p) { do_oop_nv(p); } | |
75 }; | |
76 | |
342 | 77 class G1ParScanClosure : public G1ParClosureSuper { |
78 public: | |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
79 G1ParScanClosure(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state, ReferenceProcessor* rp) : |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
80 G1ParClosureSuper(g1, par_scan_state) |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
81 { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
82 assert(_ref_processor == NULL, "sanity"); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
83 _ref_processor = rp; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
84 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
85 |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
579
diff
changeset
|
86 template <class T> void do_oop_nv(T* p); |
342 | 87 virtual void do_oop(oop* p) { do_oop_nv(p); } |
88 virtual void do_oop(narrowOop* p) { do_oop_nv(p); } | |
89 }; | |
90 | |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
579
diff
changeset
|
91 #define G1_PARTIAL_ARRAY_MASK 0x2 |
342 | 92 |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
579
diff
changeset
|
93 template <class T> inline bool has_partial_array_mask(T* ref) { |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
579
diff
changeset
|
94 return ((uintptr_t)ref & G1_PARTIAL_ARRAY_MASK) == G1_PARTIAL_ARRAY_MASK; |
526 | 95 } |
96 | |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
579
diff
changeset
|
97 template <class T> inline T* set_partial_array_mask(T obj) { |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
579
diff
changeset
|
98 assert(((uintptr_t)obj & G1_PARTIAL_ARRAY_MASK) == 0, "Information loss!"); |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
579
diff
changeset
|
99 return (T*) ((uintptr_t)obj | G1_PARTIAL_ARRAY_MASK); |
526 | 100 } |
101 | |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
579
diff
changeset
|
102 template <class T> inline oop clear_partial_array_mask(T* ref) { |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
579
diff
changeset
|
103 return oop((intptr_t)ref & ~G1_PARTIAL_ARRAY_MASK); |
526 | 104 } |
105 | |
342 | 106 class G1ParScanPartialArrayClosure : public G1ParClosureSuper { |
107 G1ParScanClosure _scanner; | |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
108 |
342 | 109 public: |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
110 G1ParScanPartialArrayClosure(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state, ReferenceProcessor* rp) : |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
111 G1ParClosureSuper(g1, par_scan_state), _scanner(g1, par_scan_state, rp) |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
112 { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
113 assert(_ref_processor == NULL, "sanity"); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
114 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
115 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
116 G1ParScanClosure* scanner() { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
117 return &_scanner; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
118 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
119 |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
579
diff
changeset
|
120 template <class T> void do_oop_nv(T* p); |
342 | 121 virtual void do_oop(oop* p) { do_oop_nv(p); } |
122 virtual void do_oop(narrowOop* p) { do_oop_nv(p); } | |
123 }; | |
124 | |
125 | |
126 class G1ParCopyHelper : public G1ParClosureSuper { | |
127 G1ParScanClosure *_scanner; | |
128 protected: | |
3886
eeae91c9baba
7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents:
3771
diff
changeset
|
129 template <class T> void mark_object(T* p); |
3973
663cb89032b1
7092412: G1: Some roots not marked during an initial mark that gets an evacuation failure
johnc
parents:
3886
diff
changeset
|
130 oop copy_to_survivor_space(oop obj, bool should_mark_root, |
663cb89032b1
7092412: G1: Some roots not marked during an initial mark that gets an evacuation failure
johnc
parents:
3886
diff
changeset
|
131 bool should_mark_copy); |
342 | 132 public: |
133 G1ParCopyHelper(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state, | |
134 G1ParScanClosure *scanner) : | |
135 G1ParClosureSuper(g1, par_scan_state), _scanner(scanner) { } | |
136 }; | |
137 | |
526 | 138 template<bool do_gen_barrier, G1Barrier barrier, |
3886
eeae91c9baba
7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents:
3771
diff
changeset
|
139 bool do_mark_object> |
342 | 140 class G1ParCopyClosure : public G1ParCopyHelper { |
141 G1ParScanClosure _scanner; | |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
142 |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
579
diff
changeset
|
143 template <class T> void do_oop_work(T* p); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
144 |
342 | 145 public: |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
146 G1ParCopyClosure(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state, |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
147 ReferenceProcessor* rp) : |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
148 _scanner(g1, par_scan_state, rp), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
149 G1ParCopyHelper(g1, par_scan_state, &_scanner) |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
150 { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
151 assert(_ref_processor == NULL, "sanity"); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
152 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
153 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
154 G1ParScanClosure* scanner() { return &_scanner; } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
155 |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
579
diff
changeset
|
156 template <class T> void do_oop_nv(T* p) { |
342 | 157 do_oop_work(p); |
158 } | |
159 virtual void do_oop(oop* p) { do_oop_nv(p); } | |
160 virtual void do_oop(narrowOop* p) { do_oop_nv(p); } | |
161 }; | |
162 | |
1261 | 163 typedef G1ParCopyClosure<false, G1BarrierNone, false> G1ParScanExtRootClosure; |
164 typedef G1ParCopyClosure<true, G1BarrierNone, false> G1ParScanPermClosure; | |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
165 |
1261 | 166 typedef G1ParCopyClosure<false, G1BarrierNone, true> G1ParScanAndMarkExtRootClosure; |
167 typedef G1ParCopyClosure<true, G1BarrierNone, true> G1ParScanAndMarkPermClosure; | |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
168 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
169 // The following closure types are no longer used but are retained |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
170 // for historical reasons: |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
171 // typedef G1ParCopyClosure<false, G1BarrierRS, false> G1ParScanHeapRSClosure; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
172 // typedef G1ParCopyClosure<false, G1BarrierRS, true> G1ParScanAndMarkHeapRSClosure; |
1261 | 173 |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
174 // The following closure type is defined in g1_specialized_oop_closures.hpp: |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
175 // |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
176 // typedef G1ParCopyClosure<false, G1BarrierEvac, false> G1ParScanHeapEvacClosure; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
177 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
178 // We use a separate closure to handle references during evacuation |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
179 // failure processing. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
180 // We could have used another instance of G1ParScanHeapEvacClosure |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
181 // (since that closure no longer assumes that the references it |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
182 // handles point into the collection set). |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
183 |
1261 | 184 typedef G1ParCopyClosure<false, G1BarrierEvac, false> G1ParScanHeapEvacFailureClosure; |
342 | 185 |
186 class FilterIntoCSClosure: public OopClosure { | |
187 G1CollectedHeap* _g1; | |
188 OopClosure* _oc; | |
189 DirtyCardToOopClosure* _dcto_cl; | |
190 public: | |
191 FilterIntoCSClosure( DirtyCardToOopClosure* dcto_cl, | |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
192 G1CollectedHeap* g1, |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
193 OopClosure* oc, |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
194 ReferenceProcessor* rp) : |
342 | 195 _dcto_cl(dcto_cl), _g1(g1), _oc(oc) |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
196 { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
197 assert(_ref_processor == NULL, "sanity"); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
198 _ref_processor = rp; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
199 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
200 |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
579
diff
changeset
|
201 template <class T> void do_oop_nv(T* p); |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
579
diff
changeset
|
202 virtual void do_oop(oop* p) { do_oop_nv(p); } |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
579
diff
changeset
|
203 virtual void do_oop(narrowOop* p) { do_oop_nv(p); } |
342 | 204 bool apply_to_weak_ref_discovered_field() { return true; } |
205 bool do_header() { return false; } | |
206 }; | |
207 | |
208 class FilterOutOfRegionClosure: public OopClosure { | |
209 HeapWord* _r_bottom; | |
210 HeapWord* _r_end; | |
211 OopClosure* _oc; | |
212 int _out_of_region; | |
213 public: | |
214 FilterOutOfRegionClosure(HeapRegion* r, OopClosure* oc); | |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
579
diff
changeset
|
215 template <class T> void do_oop_nv(T* p); |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
579
diff
changeset
|
216 virtual void do_oop(oop* p) { do_oop_nv(p); } |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
579
diff
changeset
|
217 virtual void do_oop(narrowOop* p) { do_oop_nv(p); } |
342 | 218 bool apply_to_weak_ref_discovered_field() { return true; } |
219 bool do_header() { return false; } | |
220 int out_of_region() { return _out_of_region; } | |
221 }; | |
1972 | 222 |
3771 | 223 // Closure for iterating over object fields during concurrent marking |
224 class G1CMOopClosure : public OopClosure { | |
225 G1CollectedHeap* _g1h; | |
226 ConcurrentMark* _cm; | |
227 CMTask* _task; | |
228 public: | |
229 G1CMOopClosure(G1CollectedHeap* g1h, ConcurrentMark* cm, CMTask* task); | |
230 template <class T> void do_oop_nv(T* p); | |
231 virtual void do_oop( oop* p) { do_oop_nv(p); } | |
232 virtual void do_oop(narrowOop* p) { do_oop_nv(p); } | |
233 }; | |
234 | |
1972 | 235 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1OOPCLOSURES_HPP |