comparison src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp @ 263:12eea04c8b06

6672698: mangle_unused_area() should not remangle the entire heap at each collection. Summary: Maintain a high water mark for the allocations in a space and mangle only up to that high water mark. Reviewed-by: ysr, apetrusenko
author jmasa
date Wed, 09 Jul 2008 15:08:55 -0700
parents a61af66fc99e
children 9ee9cf798b59 a4b729f5b611
comparison
equal deleted inserted replaced
225:286bee59f34b 263:12eea04c8b06
96 PSPermGen* perm_gen = heap->perm_gen(); 96 PSPermGen* perm_gen = heap->perm_gen();
97 97
98 // Increment the invocation count 98 // Increment the invocation count
99 heap->increment_total_collections(true /* full */); 99 heap->increment_total_collections(true /* full */);
100 100
101 // Save information needed to minimize mangling
102 heap->record_gen_tops_before_GC();
103
101 // We need to track unique mark sweep invocations as well. 104 // We need to track unique mark sweep invocations as well.
102 _total_invocations++; 105 _total_invocations++;
103 106
104 AdaptiveSizePolicyOutput(size_policy, heap->total_collections()); 107 AdaptiveSizePolicyOutput(size_policy, heap->total_collections());
105 108
186 189
187 restore_marks(); 190 restore_marks();
188 191
189 deallocate_stacks(); 192 deallocate_stacks();
190 193
194 if (ZapUnusedHeapArea) {
195 // Do a complete mangle (top to end) because the usage for
196 // scratch does not maintain a top pointer.
197 young_gen->to_space()->mangle_unused_area_complete();
198 }
199
191 eden_empty = young_gen->eden_space()->is_empty(); 200 eden_empty = young_gen->eden_space()->is_empty();
192 if (!eden_empty) { 201 if (!eden_empty) {
193 eden_empty = absorb_live_data_from_eden(size_policy, young_gen, old_gen); 202 eden_empty = absorb_live_data_from_eden(size_policy, young_gen, old_gen);
194 } 203 }
195 204
196 // Update heap occupancy information which is used as 205 // Update heap occupancy information which is used as
197 // input to soft ref clearing policy at the next gc. 206 // input to soft ref clearing policy at the next gc.
198 Universe::update_heap_info_at_gc(); 207 Universe::update_heap_info_at_gc();
199 208
200 survivors_empty = young_gen->from_space()->is_empty() && 209 survivors_empty = young_gen->from_space()->is_empty() &&
201 young_gen->to_space()->is_empty(); 210 young_gen->to_space()->is_empty();
202 young_gen_empty = eden_empty && survivors_empty; 211 young_gen_empty = eden_empty && survivors_empty;
203 212
204 BarrierSet* bs = heap->barrier_set(); 213 BarrierSet* bs = heap->barrier_set();
205 if (bs->is_a(BarrierSet::ModRef)) { 214 if (bs->is_a(BarrierSet::ModRef)) {
206 ModRefBarrierSet* modBS = (ModRefBarrierSet*)bs; 215 ModRefBarrierSet* modBS = (ModRefBarrierSet*)bs;
342 VerifyAfterGC) { 351 VerifyAfterGC) {
343 old_gen->verify_object_start_array(); 352 old_gen->verify_object_start_array();
344 perm_gen->verify_object_start_array(); 353 perm_gen->verify_object_start_array();
345 } 354 }
346 355
356 if (ZapUnusedHeapArea) {
357 old_gen->object_space()->check_mangled_unused_area_complete();
358 perm_gen->object_space()->check_mangled_unused_area_complete();
359 }
360
347 NOT_PRODUCT(ref_processor()->verify_no_references_recorded()); 361 NOT_PRODUCT(ref_processor()->verify_no_references_recorded());
348 362
349 if (PrintHeapAtGC) { 363 if (PrintHeapAtGC) {
350 Universe::print_heap_after_gc(); 364 Universe::print_heap_after_gc();
351 } 365 }