comparison src/share/vm/memory/genMarkSweep.cpp @ 7448:b735136e0d82

8004132: SerialGC: ValidateMarkSweep broken when running GCOld Summary: Remove bit-rotten ValidateMarkSweep functionality and flag. Reviewed-by: johnc, jmasa Contributed-by: tamao <tao.mao@oracle.com>
author johnc
date Wed, 02 Jan 2013 11:32:41 -0800
parents f34d701e952e
children a08c80e9e1e5
comparison
equal deleted inserted replaced
7447:1de1b145f6bc 7448:b735136e0d82
98 COMPILER2_PRESENT(assert(DerivedPointerTable::is_active(), "Sanity")); 98 COMPILER2_PRESENT(assert(DerivedPointerTable::is_active(), "Sanity"));
99 COMPILER2_PRESENT(DerivedPointerTable::set_active(false)); 99 COMPILER2_PRESENT(DerivedPointerTable::set_active(false));
100 100
101 mark_sweep_phase3(level); 101 mark_sweep_phase3(level);
102 102
103 VALIDATE_MARK_SWEEP_ONLY(
104 if (ValidateMarkSweep) {
105 guarantee(_root_refs_stack->length() == 0, "should be empty by now");
106 }
107 )
108
109 mark_sweep_phase4(); 103 mark_sweep_phase4();
110
111 VALIDATE_MARK_SWEEP_ONLY(
112 if (ValidateMarkSweep) {
113 guarantee(_live_oops->length() == _live_oops_moved_to->length(),
114 "should be the same size");
115 }
116 )
117 104
118 restore_marks(); 105 restore_marks();
119 106
120 // Set saved marks for allocation profiler (and other things? -- dld) 107 // Set saved marks for allocation profiler (and other things? -- dld)
121 // (Should this be in general part?) 108 // (Should this be in general part?)
185 _preserved_count_max = 0; 172 _preserved_count_max = 0;
186 } 173 }
187 174
188 _preserved_marks = (PreservedMark*)scratch; 175 _preserved_marks = (PreservedMark*)scratch;
189 _preserved_count = 0; 176 _preserved_count = 0;
190
191 #ifdef VALIDATE_MARK_SWEEP
192 if (ValidateMarkSweep) {
193 _root_refs_stack = new (ResourceObj::C_HEAP, mtGC) GrowableArray<void*>(100, true);
194 _other_refs_stack = new (ResourceObj::C_HEAP, mtGC) GrowableArray<void*>(100, true);
195 _adjusted_pointers = new (ResourceObj::C_HEAP, mtGC) GrowableArray<void*>(100, true);
196 _live_oops = new (ResourceObj::C_HEAP, mtGC) GrowableArray<oop>(100, true);
197 _live_oops_moved_to = new (ResourceObj::C_HEAP, mtGC) GrowableArray<oop>(100, true);
198 _live_oops_size = new (ResourceObj::C_HEAP, mtGC) GrowableArray<size_t>(100, true);
199 }
200 if (RecordMarkSweepCompaction) {
201 if (_cur_gc_live_oops == NULL) {
202 _cur_gc_live_oops = new(ResourceObj::C_HEAP, mtGC) GrowableArray<HeapWord*>(100, true);
203 _cur_gc_live_oops_moved_to = new(ResourceObj::C_HEAP, mtGC) GrowableArray<HeapWord*>(100, true);
204 _cur_gc_live_oops_size = new(ResourceObj::C_HEAP, mtGC) GrowableArray<size_t>(100, true);
205 _last_gc_live_oops = new(ResourceObj::C_HEAP, mtGC) GrowableArray<HeapWord*>(100, true);
206 _last_gc_live_oops_moved_to = new(ResourceObj::C_HEAP, mtGC) GrowableArray<HeapWord*>(100, true);
207 _last_gc_live_oops_size = new(ResourceObj::C_HEAP, mtGC) GrowableArray<size_t>(100, true);
208 } else {
209 _cur_gc_live_oops->clear();
210 _cur_gc_live_oops_moved_to->clear();
211 _cur_gc_live_oops_size->clear();
212 }
213 }
214 #endif
215 } 177 }
216 178
217 179
218 void GenMarkSweep::deallocate_stacks() { 180 void GenMarkSweep::deallocate_stacks() {
219 if (!UseG1GC) { 181 if (!UseG1GC) {
223 185
224 _preserved_mark_stack.clear(true); 186 _preserved_mark_stack.clear(true);
225 _preserved_oop_stack.clear(true); 187 _preserved_oop_stack.clear(true);
226 _marking_stack.clear(); 188 _marking_stack.clear();
227 _objarray_stack.clear(true); 189 _objarray_stack.clear(true);
228
229 #ifdef VALIDATE_MARK_SWEEP
230 if (ValidateMarkSweep) {
231 delete _root_refs_stack;
232 delete _other_refs_stack;
233 delete _adjusted_pointers;
234 delete _live_oops;
235 delete _live_oops_size;
236 delete _live_oops_moved_to;
237 _live_oops_index = 0;
238 _live_oops_index_at_perm = 0;
239 }
240 #endif
241 } 190 }
242 191
243 void GenMarkSweep::mark_sweep_phase1(int level, 192 void GenMarkSweep::mark_sweep_phase1(int level,
244 bool clear_all_softrefs) { 193 bool clear_all_softrefs) {
245 // Recursively traverse all live objects and mark them 194 // Recursively traverse all live objects and mark them
246 TraceTime tm("phase 1", PrintGC && Verbose, true, gclog_or_tty); 195 TraceTime tm("phase 1", PrintGC && Verbose, true, gclog_or_tty);
247 trace(" 1"); 196 trace(" 1");
248
249 VALIDATE_MARK_SWEEP_ONLY(reset_live_oop_tracking());
250 197
251 GenCollectedHeap* gch = GenCollectedHeap::heap(); 198 GenCollectedHeap* gch = GenCollectedHeap::heap();
252 199
253 // Because follow_root_closure is created statically, cannot 200 // Because follow_root_closure is created statically, cannot
254 // use OopsInGenClosure constructor which takes a generation, 201 // use OopsInGenClosure constructor which takes a generation,
313 GenCollectedHeap* gch = GenCollectedHeap::heap(); 260 GenCollectedHeap* gch = GenCollectedHeap::heap();
314 261
315 TraceTime tm("phase 2", PrintGC && Verbose, true, gclog_or_tty); 262 TraceTime tm("phase 2", PrintGC && Verbose, true, gclog_or_tty);
316 trace("2"); 263 trace("2");
317 264
318 VALIDATE_MARK_SWEEP_ONLY(reset_live_oop_tracking());
319
320 gch->prepare_for_compaction(); 265 gch->prepare_for_compaction();
321 } 266 }
322 267
323 class GenAdjustPointersClosure: public GenCollectedHeap::GenClosure { 268 class GenAdjustPointersClosure: public GenCollectedHeap::GenClosure {
324 public: 269 public:
334 TraceTime tm("phase 3", PrintGC && Verbose, true, gclog_or_tty); 279 TraceTime tm("phase 3", PrintGC && Verbose, true, gclog_or_tty);
335 trace("3"); 280 trace("3");
336 281
337 // Need new claim bits for the pointer adjustment tracing. 282 // Need new claim bits for the pointer adjustment tracing.
338 ClassLoaderDataGraph::clear_claimed_marks(); 283 ClassLoaderDataGraph::clear_claimed_marks();
339
340 VALIDATE_MARK_SWEEP_ONLY(reset_live_oop_tracking());
341 284
342 // Because the two closures below are created statically, cannot 285 // Because the two closures below are created statically, cannot
343 // use OopsInGenClosure constructor which takes a generation, 286 // use OopsInGenClosure constructor which takes a generation,
344 // as the Universe has not been created when the static constructors 287 // as the Universe has not been created when the static constructors
345 // are run. 288 // are run.
391 GenCollectedHeap* gch = GenCollectedHeap::heap(); 334 GenCollectedHeap* gch = GenCollectedHeap::heap();
392 335
393 TraceTime tm("phase 4", PrintGC && Verbose, true, gclog_or_tty); 336 TraceTime tm("phase 4", PrintGC && Verbose, true, gclog_or_tty);
394 trace("4"); 337 trace("4");
395 338
396 VALIDATE_MARK_SWEEP_ONLY(reset_live_oop_tracking());
397
398 GenCompactClosure blk; 339 GenCompactClosure blk;
399 gch->generation_iterate(&blk, true); 340 gch->generation_iterate(&blk, true);
400 341 }
401 VALIDATE_MARK_SWEEP_ONLY(compaction_complete());
402 }