comparison src/share/vm/gc_implementation/parallelScavenge/psMarkSweepDecorator.cpp @ 113:ba764ed4b6f2

6420645: Create a vm that uses compressed oops for up to 32gb heapsizes Summary: Compressed oops in instances, arrays, and headers. Code contributors are coleenp, phh, never, swamyv Reviewed-by: jmasa, kamg, acorn, tbell, kvn, rasbold
author coleenp
date Sun, 13 Apr 2008 17:43:42 -0400
parents a61af66fc99e
children d1605aabd0a1 12eea04c8b06
comparison
equal deleted inserted replaced
110:a49a647afe9a 113:ba764ed4b6f2
166 if (!UseParallelOldGC || !VerifyParallelOldWithMarkSweep) { 166 if (!UseParallelOldGC || !VerifyParallelOldWithMarkSweep) {
167 if (start_array) 167 if (start_array)
168 start_array->allocate_block(compact_top); 168 start_array->allocate_block(compact_top);
169 } 169 }
170 170
171 debug_only(MarkSweep::register_live_oop(oop(q), size)); 171 VALIDATE_MARK_SWEEP_ONLY(MarkSweep::register_live_oop(oop(q), size));
172 compact_top += size; 172 compact_top += size;
173 assert(compact_top <= dest->space()->end(), 173 assert(compact_top <= dest->space()->end(),
174 "Exceeding space in destination"); 174 "Exceeding space in destination");
175 175
176 q += size; 176 q += size;
232 // Update object start array 232 // Update object start array
233 if (start_array) 233 if (start_array)
234 start_array->allocate_block(compact_top); 234 start_array->allocate_block(compact_top);
235 } 235 }
236 236
237 debug_only(MarkSweep::register_live_oop(oop(q), sz)); 237 VALIDATE_MARK_SWEEP_ONLY(MarkSweep::register_live_oop(oop(q), sz));
238 compact_top += sz; 238 compact_top += sz;
239 assert(compact_top <= dest->space()->end(), 239 assert(compact_top <= dest->space()->end(),
240 "Exceeding space in destination"); 240 "Exceeding space in destination");
241 241
242 q = end; 242 q = end;
324 // reinitialized the mark word during the previous pass, so we can't 324 // reinitialized the mark word during the previous pass, so we can't
325 // use is_gc_marked for the traversal. 325 // use is_gc_marked for the traversal.
326 HeapWord* end = _first_dead; 326 HeapWord* end = _first_dead;
327 327
328 while (q < end) { 328 while (q < end) {
329 debug_only(MarkSweep::track_interior_pointers(oop(q))); 329 VALIDATE_MARK_SWEEP_ONLY(MarkSweep::track_interior_pointers(oop(q)));
330
331 // point all the oops to the new location 330 // point all the oops to the new location
332 size_t size = oop(q)->adjust_pointers(); 331 size_t size = oop(q)->adjust_pointers();
333 332 VALIDATE_MARK_SWEEP_ONLY(MarkSweep::check_interior_pointers());
334 debug_only(MarkSweep::check_interior_pointers()); 333 VALIDATE_MARK_SWEEP_ONLY(MarkSweep::validate_live_oop(oop(q), size));
335
336 debug_only(MarkSweep::validate_live_oop(oop(q), size));
337
338 q += size; 334 q += size;
339 } 335 }
340 336
341 if (_first_dead == t) { 337 if (_first_dead == t) {
342 q = t; 338 q = t;
352 while (q < t) { 348 while (q < t) {
353 // prefetch beyond q 349 // prefetch beyond q
354 Prefetch::write(q, interval); 350 Prefetch::write(q, interval);
355 if (oop(q)->is_gc_marked()) { 351 if (oop(q)->is_gc_marked()) {
356 // q is alive 352 // q is alive
357 debug_only(MarkSweep::track_interior_pointers(oop(q))); 353 VALIDATE_MARK_SWEEP_ONLY(MarkSweep::track_interior_pointers(oop(q)));
358 // point all the oops to the new location 354 // point all the oops to the new location
359 size_t size = oop(q)->adjust_pointers(); 355 size_t size = oop(q)->adjust_pointers();
360 debug_only(MarkSweep::check_interior_pointers()); 356 VALIDATE_MARK_SWEEP_ONLY(MarkSweep::check_interior_pointers());
361 debug_only(MarkSweep::validate_live_oop(oop(q), size)); 357 VALIDATE_MARK_SWEEP_ONLY(MarkSweep::validate_live_oop(oop(q), size));
362 debug_only(prev_q = q); 358 debug_only(prev_q = q);
363 q += size; 359 q += size;
364 } else { 360 } else {
365 // q is not a live object, so its mark should point at the next 361 // q is not a live object, so its mark should point at the next
366 // live object 362 // live object
390 HeapWord* const end = _first_dead; 386 HeapWord* const end = _first_dead;
391 387
392 while (q < end) { 388 while (q < end) {
393 size_t size = oop(q)->size(); 389 size_t size = oop(q)->size();
394 assert(!oop(q)->is_gc_marked(), "should be unmarked (special dense prefix handling)"); 390 assert(!oop(q)->is_gc_marked(), "should be unmarked (special dense prefix handling)");
395 debug_only(MarkSweep::live_oop_moved_to(q, size, q)); 391 VALIDATE_MARK_SWEEP_ONLY(MarkSweep::live_oop_moved_to(q, size, q));
396 debug_only(prev_q = q); 392 debug_only(prev_q = q);
397 q += size; 393 q += size;
398 } 394 }
399 #endif 395 #endif
400 396
425 421
426 // prefetch beyond compaction_top 422 // prefetch beyond compaction_top
427 Prefetch::write(compaction_top, copy_interval); 423 Prefetch::write(compaction_top, copy_interval);
428 424
429 // copy object and reinit its mark 425 // copy object and reinit its mark
430 debug_only(MarkSweep::live_oop_moved_to(q, size, compaction_top)); 426 VALIDATE_MARK_SWEEP_ONLY(MarkSweep::live_oop_moved_to(q, size, compaction_top));
431 assert(q != compaction_top, "everything in this pass should be moving"); 427 assert(q != compaction_top, "everything in this pass should be moving");
432 Copy::aligned_conjoint_words(q, compaction_top, size); 428 Copy::aligned_conjoint_words(q, compaction_top, size);
433 oop(compaction_top)->init_mark(); 429 oop(compaction_top)->init_mark();
434 assert(oop(compaction_top)->klass() != NULL, "should have a class"); 430 assert(oop(compaction_top)->klass() != NULL, "should have a class");
435 431