Mercurial > hg > graal-compiler
annotate src/share/vm/gc_implementation/shared/markSweep.cpp @ 1941:79d04223b8a5
Added caching for resolved types and resolved fields.
This is crucial, because the local load elimination will lead to wrong results, if field equality (of two RiField objects with the same object and the same RiType) is not given. The caching makes sure that the default equals implementation is sufficient.
author | Thomas Wuerthinger <wuerthinger@ssw.jku.at> |
---|---|
date | Tue, 28 Dec 2010 18:33:26 +0100 |
parents | 894b1d7c7e01 |
children | f95d63e2154a |
rev | line source |
---|---|
0 | 1 /* |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1315
diff
changeset
|
2 * Copyright (c) 1997, 2009, Oracle and/or its affiliates. All rights reserved. |
0 | 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:
1315
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1315
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:
1315
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
25 #include "incls/_precompiled.incl" | |
26 #include "incls/_markSweep.cpp.incl" | |
27 | |
1836
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
28 Stack<oop> MarkSweep::_marking_stack; |
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
29 Stack<DataLayout*> MarkSweep::_revisit_mdo_stack; |
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
30 Stack<Klass*> MarkSweep::_revisit_klass_stack; |
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
31 Stack<ObjArrayTask> MarkSweep::_objarray_stack; |
0 | 32 |
1836
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
33 Stack<oop> MarkSweep::_preserved_oop_stack; |
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
34 Stack<markOop> MarkSweep::_preserved_mark_stack; |
0 | 35 size_t MarkSweep::_preserved_count = 0; |
36 size_t MarkSweep::_preserved_count_max = 0; | |
37 PreservedMark* MarkSweep::_preserved_marks = NULL; | |
38 ReferenceProcessor* MarkSweep::_ref_processor = NULL; | |
39 | |
40 #ifdef VALIDATE_MARK_SWEEP | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
41 GrowableArray<void*>* MarkSweep::_root_refs_stack = NULL; |
0 | 42 GrowableArray<oop> * MarkSweep::_live_oops = NULL; |
43 GrowableArray<oop> * MarkSweep::_live_oops_moved_to = NULL; | |
44 GrowableArray<size_t>* MarkSweep::_live_oops_size = NULL; | |
45 size_t MarkSweep::_live_oops_index = 0; | |
46 size_t MarkSweep::_live_oops_index_at_perm = 0; | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
47 GrowableArray<void*>* MarkSweep::_other_refs_stack = NULL; |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
48 GrowableArray<void*>* MarkSweep::_adjusted_pointers = NULL; |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
49 bool MarkSweep::_pointer_tracking = false; |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
50 bool MarkSweep::_root_tracking = true; |
0 | 51 |
52 GrowableArray<HeapWord*>* MarkSweep::_cur_gc_live_oops = NULL; | |
53 GrowableArray<HeapWord*>* MarkSweep::_cur_gc_live_oops_moved_to = NULL; | |
54 GrowableArray<size_t> * MarkSweep::_cur_gc_live_oops_size = NULL; | |
55 GrowableArray<HeapWord*>* MarkSweep::_last_gc_live_oops = NULL; | |
56 GrowableArray<HeapWord*>* MarkSweep::_last_gc_live_oops_moved_to = NULL; | |
57 GrowableArray<size_t> * MarkSweep::_last_gc_live_oops_size = NULL; | |
58 #endif | |
59 | |
60 void MarkSweep::revisit_weak_klass_link(Klass* k) { | |
1836
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
61 _revisit_klass_stack.push(k); |
0 | 62 } |
63 | |
64 void MarkSweep::follow_weak_klass_links() { | |
65 // All klasses on the revisit stack are marked at this point. | |
66 // Update and follow all subklass, sibling and implementor links. | |
941 | 67 if (PrintRevisitStats) { |
1836
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
68 gclog_or_tty->print_cr("#classes in system dictionary = %d", |
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
69 SystemDictionary::number_of_classes()); |
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
70 gclog_or_tty->print_cr("Revisit klass stack size = " SIZE_FORMAT, |
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
71 _revisit_klass_stack.size()); |
941 | 72 } |
1836
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
73 while (!_revisit_klass_stack.is_empty()) { |
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
74 Klass* const k = _revisit_klass_stack.pop(); |
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
75 k->follow_weak_klass_links(&is_alive, &keep_alive); |
0 | 76 } |
77 follow_stack(); | |
78 } | |
79 | |
941 | 80 void MarkSweep::revisit_mdo(DataLayout* p) { |
1836
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
81 _revisit_mdo_stack.push(p); |
941 | 82 } |
83 | |
84 void MarkSweep::follow_mdo_weak_refs() { | |
85 // All strongly reachable oops have been marked at this point; | |
86 // we can visit and clear any weak references from MDO's which | |
87 // we memoized during the strong marking phase. | |
1836
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
88 assert(_marking_stack.is_empty(), "Marking stack should be empty"); |
941 | 89 if (PrintRevisitStats) { |
1836
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
90 gclog_or_tty->print_cr("#classes in system dictionary = %d", |
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
91 SystemDictionary::number_of_classes()); |
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
92 gclog_or_tty->print_cr("Revisit MDO stack size = " SIZE_FORMAT, |
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
93 _revisit_mdo_stack.size()); |
941 | 94 } |
1836
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
95 while (!_revisit_mdo_stack.is_empty()) { |
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
96 _revisit_mdo_stack.pop()->follow_weak_refs(&is_alive); |
941 | 97 } |
98 follow_stack(); | |
99 } | |
100 | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
101 MarkSweep::FollowRootClosure MarkSweep::follow_root_closure; |
989
148e5441d916
6863023: need non-perm oops in code cache for JSR 292
jrose
parents:
196
diff
changeset
|
102 CodeBlobToOopClosure MarkSweep::follow_code_root_closure(&MarkSweep::follow_root_closure, /*do_marking=*/ true); |
0 | 103 |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
104 void MarkSweep::FollowRootClosure::do_oop(oop* p) { follow_root(p); } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
105 void MarkSweep::FollowRootClosure::do_oop(narrowOop* p) { follow_root(p); } |
0 | 106 |
107 MarkSweep::MarkAndPushClosure MarkSweep::mark_and_push_closure; | |
108 | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
109 void MarkSweep::MarkAndPushClosure::do_oop(oop* p) { mark_and_push(p); } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
110 void MarkSweep::MarkAndPushClosure::do_oop(narrowOop* p) { mark_and_push(p); } |
0 | 111 |
112 void MarkSweep::follow_stack() { | |
1311
2a1472c30599
4396719: Mark Sweep stack overflow on deeply nested Object arrays
jcoomes
parents:
1000
diff
changeset
|
113 do { |
1836
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
114 while (!_marking_stack.is_empty()) { |
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
115 oop obj = _marking_stack.pop(); |
1311
2a1472c30599
4396719: Mark Sweep stack overflow on deeply nested Object arrays
jcoomes
parents:
1000
diff
changeset
|
116 assert (obj->is_gc_marked(), "p must be marked"); |
2a1472c30599
4396719: Mark Sweep stack overflow on deeply nested Object arrays
jcoomes
parents:
1000
diff
changeset
|
117 obj->follow_contents(); |
2a1472c30599
4396719: Mark Sweep stack overflow on deeply nested Object arrays
jcoomes
parents:
1000
diff
changeset
|
118 } |
1315
c385bf94cfb8
6935839: excessive marking stack growth during full gcs
jcoomes
parents:
1311
diff
changeset
|
119 // Process ObjArrays one at a time to avoid marking stack bloat. |
1836
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
120 if (!_objarray_stack.is_empty()) { |
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
121 ObjArrayTask task = _objarray_stack.pop(); |
1311
2a1472c30599
4396719: Mark Sweep stack overflow on deeply nested Object arrays
jcoomes
parents:
1000
diff
changeset
|
122 objArrayKlass* const k = (objArrayKlass*)task.obj()->blueprint(); |
2a1472c30599
4396719: Mark Sweep stack overflow on deeply nested Object arrays
jcoomes
parents:
1000
diff
changeset
|
123 k->oop_follow_contents(task.obj(), task.index()); |
2a1472c30599
4396719: Mark Sweep stack overflow on deeply nested Object arrays
jcoomes
parents:
1000
diff
changeset
|
124 } |
1836
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
125 } while (!_marking_stack.is_empty() || !_objarray_stack.is_empty()); |
0 | 126 } |
127 | |
128 MarkSweep::FollowStackClosure MarkSweep::follow_stack_closure; | |
129 | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
130 void MarkSweep::FollowStackClosure::do_void() { follow_stack(); } |
0 | 131 |
1836
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
132 // We preserve the mark which should be replaced at the end and the location |
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
133 // that it will go. Note that the object that this markOop belongs to isn't |
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
134 // currently at that address but it will be after phase4 |
0 | 135 void MarkSweep::preserve_mark(oop obj, markOop mark) { |
1836
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
136 // We try to store preserved marks in the to space of the new generation since |
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
137 // this is storage which should be available. Most of the time this should be |
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
138 // sufficient space for the marks we need to preserve but if it isn't we fall |
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
139 // back to using Stacks to keep track of the overflow. |
0 | 140 if (_preserved_count < _preserved_count_max) { |
141 _preserved_marks[_preserved_count++].init(obj, mark); | |
142 } else { | |
1836
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
143 _preserved_mark_stack.push(mark); |
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
144 _preserved_oop_stack.push(obj); |
0 | 145 } |
146 } | |
147 | |
148 MarkSweep::AdjustPointerClosure MarkSweep::adjust_root_pointer_closure(true); | |
149 MarkSweep::AdjustPointerClosure MarkSweep::adjust_pointer_closure(false); | |
150 | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
151 void MarkSweep::AdjustPointerClosure::do_oop(oop* p) { adjust_pointer(p, _is_root); } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
152 void MarkSweep::AdjustPointerClosure::do_oop(narrowOop* p) { adjust_pointer(p, _is_root); } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
153 |
0 | 154 void MarkSweep::adjust_marks() { |
1836
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
155 assert( _preserved_oop_stack.size() == _preserved_mark_stack.size(), |
0 | 156 "inconsistent preserved oop stacks"); |
157 | |
158 // adjust the oops we saved earlier | |
159 for (size_t i = 0; i < _preserved_count; i++) { | |
160 _preserved_marks[i].adjust_pointer(); | |
161 } | |
162 | |
163 // deal with the overflow stack | |
1836
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
164 StackIterator<oop> iter(_preserved_oop_stack); |
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
165 while (!iter.is_empty()) { |
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
166 oop* p = iter.next_addr(); |
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
167 adjust_pointer(p); |
0 | 168 } |
169 } | |
170 | |
171 void MarkSweep::restore_marks() { | |
1836
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
172 assert(_preserved_oop_stack.size() == _preserved_mark_stack.size(), |
0 | 173 "inconsistent preserved oop stacks"); |
174 if (PrintGC && Verbose) { | |
1836
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
175 gclog_or_tty->print_cr("Restoring %d marks", |
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
176 _preserved_count + _preserved_oop_stack.size()); |
0 | 177 } |
178 | |
179 // restore the marks we saved earlier | |
180 for (size_t i = 0; i < _preserved_count; i++) { | |
181 _preserved_marks[i].restore(); | |
182 } | |
183 | |
184 // deal with the overflow | |
1836
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
185 while (!_preserved_oop_stack.is_empty()) { |
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
186 oop obj = _preserved_oop_stack.pop(); |
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
187 markOop mark = _preserved_mark_stack.pop(); |
894b1d7c7e01
6423256: GC stacks should use a better data structure
jcoomes
parents:
1552
diff
changeset
|
188 obj->set_mark(mark); |
0 | 189 } |
190 } | |
191 | |
192 #ifdef VALIDATE_MARK_SWEEP | |
193 | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
194 void MarkSweep::track_adjusted_pointer(void* p, bool isroot) { |
0 | 195 if (!ValidateMarkSweep) |
196 return; | |
197 | |
198 if (!isroot) { | |
199 if (_pointer_tracking) { | |
200 guarantee(_adjusted_pointers->contains(p), "should have seen this pointer"); | |
201 _adjusted_pointers->remove(p); | |
202 } | |
203 } else { | |
204 ptrdiff_t index = _root_refs_stack->find(p); | |
205 if (index != -1) { | |
206 int l = _root_refs_stack->length(); | |
207 if (l > 0 && l - 1 != index) { | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
208 void* last = _root_refs_stack->pop(); |
0 | 209 assert(last != p, "should be different"); |
210 _root_refs_stack->at_put(index, last); | |
211 } else { | |
212 _root_refs_stack->remove(p); | |
213 } | |
214 } | |
215 } | |
216 } | |
217 | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
218 void MarkSweep::check_adjust_pointer(void* p) { |
0 | 219 _adjusted_pointers->push(p); |
220 } | |
221 | |
222 class AdjusterTracker: public OopClosure { | |
223 public: | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
224 AdjusterTracker() {} |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
225 void do_oop(oop* o) { MarkSweep::check_adjust_pointer(o); } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
226 void do_oop(narrowOop* o) { MarkSweep::check_adjust_pointer(o); } |
0 | 227 }; |
228 | |
229 void MarkSweep::track_interior_pointers(oop obj) { | |
230 if (ValidateMarkSweep) { | |
231 _adjusted_pointers->clear(); | |
232 _pointer_tracking = true; | |
233 | |
234 AdjusterTracker checker; | |
235 obj->oop_iterate(&checker); | |
236 } | |
237 } | |
238 | |
239 void MarkSweep::check_interior_pointers() { | |
240 if (ValidateMarkSweep) { | |
241 _pointer_tracking = false; | |
242 guarantee(_adjusted_pointers->length() == 0, "should have processed the same pointers"); | |
243 } | |
244 } | |
245 | |
246 void MarkSweep::reset_live_oop_tracking(bool at_perm) { | |
247 if (ValidateMarkSweep) { | |
248 guarantee((size_t)_live_oops->length() == _live_oops_index, "should be at end of live oops"); | |
249 _live_oops_index = at_perm ? _live_oops_index_at_perm : 0; | |
250 } | |
251 } | |
252 | |
253 void MarkSweep::register_live_oop(oop p, size_t size) { | |
254 if (ValidateMarkSweep) { | |
255 _live_oops->push(p); | |
256 _live_oops_size->push(size); | |
257 _live_oops_index++; | |
258 } | |
259 } | |
260 | |
261 void MarkSweep::validate_live_oop(oop p, size_t size) { | |
262 if (ValidateMarkSweep) { | |
263 oop obj = _live_oops->at((int)_live_oops_index); | |
264 guarantee(obj == p, "should be the same object"); | |
265 guarantee(_live_oops_size->at((int)_live_oops_index) == size, "should be the same size"); | |
266 _live_oops_index++; | |
267 } | |
268 } | |
269 | |
270 void MarkSweep::live_oop_moved_to(HeapWord* q, size_t size, | |
271 HeapWord* compaction_top) { | |
272 assert(oop(q)->forwardee() == NULL || oop(q)->forwardee() == oop(compaction_top), | |
273 "should be moved to forwarded location"); | |
274 if (ValidateMarkSweep) { | |
275 MarkSweep::validate_live_oop(oop(q), size); | |
276 _live_oops_moved_to->push(oop(compaction_top)); | |
277 } | |
278 if (RecordMarkSweepCompaction) { | |
279 _cur_gc_live_oops->push(q); | |
280 _cur_gc_live_oops_moved_to->push(compaction_top); | |
281 _cur_gc_live_oops_size->push(size); | |
282 } | |
283 } | |
284 | |
285 void MarkSweep::compaction_complete() { | |
286 if (RecordMarkSweepCompaction) { | |
287 GrowableArray<HeapWord*>* _tmp_live_oops = _cur_gc_live_oops; | |
288 GrowableArray<HeapWord*>* _tmp_live_oops_moved_to = _cur_gc_live_oops_moved_to; | |
289 GrowableArray<size_t> * _tmp_live_oops_size = _cur_gc_live_oops_size; | |
290 | |
291 _cur_gc_live_oops = _last_gc_live_oops; | |
292 _cur_gc_live_oops_moved_to = _last_gc_live_oops_moved_to; | |
293 _cur_gc_live_oops_size = _last_gc_live_oops_size; | |
294 _last_gc_live_oops = _tmp_live_oops; | |
295 _last_gc_live_oops_moved_to = _tmp_live_oops_moved_to; | |
296 _last_gc_live_oops_size = _tmp_live_oops_size; | |
297 } | |
298 } | |
299 | |
300 void MarkSweep::print_new_location_of_heap_address(HeapWord* q) { | |
301 if (!RecordMarkSweepCompaction) { | |
302 tty->print_cr("Requires RecordMarkSweepCompaction to be enabled"); | |
303 return; | |
304 } | |
305 | |
306 if (_last_gc_live_oops == NULL) { | |
307 tty->print_cr("No compaction information gathered yet"); | |
308 return; | |
309 } | |
310 | |
311 for (int i = 0; i < _last_gc_live_oops->length(); i++) { | |
312 HeapWord* old_oop = _last_gc_live_oops->at(i); | |
313 size_t sz = _last_gc_live_oops_size->at(i); | |
314 if (old_oop <= q && q < (old_oop + sz)) { | |
315 HeapWord* new_oop = _last_gc_live_oops_moved_to->at(i); | |
316 size_t offset = (q - old_oop); | |
317 tty->print_cr("Address " PTR_FORMAT, q); | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
318 tty->print_cr(" Was in oop " PTR_FORMAT ", size " SIZE_FORMAT ", at offset " SIZE_FORMAT, old_oop, sz, offset); |
0 | 319 tty->print_cr(" Now in oop " PTR_FORMAT ", actual address " PTR_FORMAT, new_oop, new_oop + offset); |
320 return; | |
321 } | |
322 } | |
323 | |
324 tty->print_cr("Address " PTR_FORMAT " not found in live oop information from last GC", q); | |
325 } | |
326 #endif //VALIDATE_MARK_SWEEP | |
327 | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
328 MarkSweep::IsAliveClosure MarkSweep::is_alive; |
0 | 329 |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
330 void MarkSweep::IsAliveClosure::do_object(oop p) { ShouldNotReachHere(); } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
331 bool MarkSweep::IsAliveClosure::do_object_b(oop p) { return p->is_gc_marked(); } |
0 | 332 |
333 MarkSweep::KeepAliveClosure MarkSweep::keep_alive; | |
334 | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
335 void MarkSweep::KeepAliveClosure::do_oop(oop* p) { MarkSweep::KeepAliveClosure::do_oop_work(p); } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
336 void MarkSweep::KeepAliveClosure::do_oop(narrowOop* p) { MarkSweep::KeepAliveClosure::do_oop_work(p); } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
337 |
0 | 338 void marksweep_init() { /* empty */ } |
339 | |
340 #ifndef PRODUCT | |
341 | |
342 void MarkSweep::trace(const char* msg) { | |
343 if (TraceMarkSweep) | |
344 gclog_or_tty->print("%s", msg); | |
345 } | |
346 | |
347 #endif |