159 _preserved_count_max = 0; |
159 _preserved_count_max = 0; |
160 } |
160 } |
161 |
161 |
162 _preserved_marks = (PreservedMark*)scratch; |
162 _preserved_marks = (PreservedMark*)scratch; |
163 _preserved_count = 0; |
163 _preserved_count = 0; |
164 _preserved_mark_stack = NULL; |
|
165 _preserved_oop_stack = NULL; |
|
166 |
|
167 _marking_stack = new (ResourceObj::C_HEAP) GrowableArray<oop>(4000, true); |
|
168 _objarray_stack = new (ResourceObj::C_HEAP) GrowableArray<ObjArrayTask>(50, true); |
|
169 |
|
170 int size = SystemDictionary::number_of_classes() * 2; |
|
171 _revisit_klass_stack = new (ResourceObj::C_HEAP) GrowableArray<Klass*>(size, true); |
|
172 // (#klass/k)^2 for k ~ 10 appears to be a better fit, but this will have to do for |
|
173 // now until we have had a chance to investigate a more optimal setting. |
|
174 _revisit_mdo_stack = new (ResourceObj::C_HEAP) GrowableArray<DataLayout*>(2*size, true); |
|
175 |
164 |
176 #ifdef VALIDATE_MARK_SWEEP |
165 #ifdef VALIDATE_MARK_SWEEP |
177 if (ValidateMarkSweep) { |
166 if (ValidateMarkSweep) { |
178 _root_refs_stack = new (ResourceObj::C_HEAP) GrowableArray<void*>(100, true); |
167 _root_refs_stack = new (ResourceObj::C_HEAP) GrowableArray<void*>(100, true); |
179 _other_refs_stack = new (ResourceObj::C_HEAP) GrowableArray<void*>(100, true); |
168 _other_refs_stack = new (ResourceObj::C_HEAP) GrowableArray<void*>(100, true); |
204 if (!UseG1GC) { |
193 if (!UseG1GC) { |
205 GenCollectedHeap* gch = GenCollectedHeap::heap(); |
194 GenCollectedHeap* gch = GenCollectedHeap::heap(); |
206 gch->release_scratch(); |
195 gch->release_scratch(); |
207 } |
196 } |
208 |
197 |
209 if (_preserved_oop_stack) { |
198 _preserved_mark_stack.clear(true); |
210 delete _preserved_mark_stack; |
199 _preserved_oop_stack.clear(true); |
211 _preserved_mark_stack = NULL; |
200 _marking_stack.clear(); |
212 delete _preserved_oop_stack; |
201 _objarray_stack.clear(true); |
213 _preserved_oop_stack = NULL; |
202 _revisit_klass_stack.clear(true); |
214 } |
203 _revisit_mdo_stack.clear(true); |
215 |
|
216 delete _marking_stack; |
|
217 delete _objarray_stack; |
|
218 delete _revisit_klass_stack; |
|
219 delete _revisit_mdo_stack; |
|
220 |
204 |
221 #ifdef VALIDATE_MARK_SWEEP |
205 #ifdef VALIDATE_MARK_SWEEP |
222 if (ValidateMarkSweep) { |
206 if (ValidateMarkSweep) { |
223 delete _root_refs_stack; |
207 delete _root_refs_stack; |
224 delete _other_refs_stack; |
208 delete _other_refs_stack; |
272 CodeCache::do_unloading(&is_alive, &keep_alive, purged_class); |
256 CodeCache::do_unloading(&is_alive, &keep_alive, purged_class); |
273 follow_stack(); // Flush marking stack |
257 follow_stack(); // Flush marking stack |
274 |
258 |
275 // Update subklass/sibling/implementor links of live klasses |
259 // Update subklass/sibling/implementor links of live klasses |
276 follow_weak_klass_links(); |
260 follow_weak_klass_links(); |
277 assert(_marking_stack->is_empty(), "just drained"); |
261 assert(_marking_stack.is_empty(), "just drained"); |
278 |
262 |
279 // Visit memoized MDO's and clear any unmarked weak refs |
263 // Visit memoized MDO's and clear any unmarked weak refs |
280 follow_mdo_weak_refs(); |
264 follow_mdo_weak_refs(); |
281 assert(_marking_stack->is_empty(), "just drained"); |
265 assert(_marking_stack.is_empty(), "just drained"); |
282 |
266 |
283 // Visit symbol and interned string tables and delete unmarked oops |
267 // Visit symbol and interned string tables and delete unmarked oops |
284 SymbolTable::unlink(&is_alive); |
268 SymbolTable::unlink(&is_alive); |
285 StringTable::unlink(&is_alive); |
269 StringTable::unlink(&is_alive); |
286 |
270 |
287 assert(_marking_stack->is_empty(), "stack should be empty by now"); |
271 assert(_marking_stack.is_empty(), "stack should be empty by now"); |
288 } |
272 } |
289 |
273 |
290 |
274 |
291 void GenMarkSweep::mark_sweep_phase2() { |
275 void GenMarkSweep::mark_sweep_phase2() { |
292 // Now all live objects are marked, compute the new object addresses. |
276 // Now all live objects are marked, compute the new object addresses. |