< prev index next >

src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp

Print this page
rev 7558 : 8048179: Early reclaim of large objects that are referenced by a few objects
Summary:
Reviewed-by:
rev 7559 : imported patch bengt-review
rev 7560 : [mq]: bengt-review2

*** 2067,2077 **** G1StringDedup::stop(); } } void G1CollectedHeap::clear_humongous_is_live_table() { ! guarantee(G1ReclaimDeadHumongousObjectsAtYoungGC, "Should only be called if true"); _humongous_is_live.clear(); } size_t G1CollectedHeap::conservative_max_heap_alignment() { return HeapRegion::max_region_size(); --- 2067,2077 ---- G1StringDedup::stop(); } } void G1CollectedHeap::clear_humongous_is_live_table() { ! guarantee(G1EagerReclaimHumongousObjects, "Should only be called if true"); _humongous_is_live.clear(); } size_t G1CollectedHeap::conservative_max_heap_alignment() { return HeapRegion::max_region_size();
*** 3493,3503 **** bool humongous_region_is_candidate(uint index) { HeapRegion* region = G1CollectedHeap::heap()->region_at(index); assert(region->is_starts_humongous(), "Must start a humongous object"); HeapRegionRemSet* const rset = region->rem_set(); ! bool const allow_stale_refs = G1ReclaimDeadHumongousObjectsWithStaleRefsAtYoungGC; return !oop(region->bottom())->is_objArray() && ((allow_stale_refs && rset->occupancy_less_or_equal_than(G1RSetSparseRegionEntries)) || (!allow_stale_refs && rset->is_empty())); } --- 3493,3503 ---- bool humongous_region_is_candidate(uint index) { HeapRegion* region = G1CollectedHeap::heap()->region_at(index); assert(region->is_starts_humongous(), "Must start a humongous object"); HeapRegionRemSet* const rset = region->rem_set(); ! bool const allow_stale_refs = G1EagerReclaimHumongousObjectsWithStaleRefs; return !oop(region->bottom())->is_objArray() && ((allow_stale_refs && rset->occupancy_less_or_equal_than(G1RSetSparseRegionEntries)) || (!allow_stale_refs && rset->is_empty())); }
*** 3551,3561 **** void flush_rem_set_entries() { _dcq.flush(); } }; void G1CollectedHeap::register_humongous_regions_with_in_cset_fast_test() { ! if (!G1ReclaimDeadHumongousObjectsAtYoungGC) { g1_policy()->phase_times()->record_fast_reclaim_humongous_stats(0.0, 0, 0); return; } double time = os::elapsed_counter(); --- 3551,3561 ---- void flush_rem_set_entries() { _dcq.flush(); } }; void G1CollectedHeap::register_humongous_regions_with_in_cset_fast_test() { ! if (!G1EagerReclaimHumongousObjects) { g1_policy()->phase_times()->record_fast_reclaim_humongous_stats(0.0, 0, 0); return; } double time = os::elapsed_counter();
*** 3566,3576 **** g1_policy()->phase_times()->record_fast_reclaim_humongous_stats(time, cl.total_humongous(), cl.candidate_humongous()); _has_humongous_reclaim_candidates = cl.candidate_humongous() > 0; ! if (_has_humongous_reclaim_candidates || G1TraceReclaimDeadHumongousObjectsAtYoungGC) { clear_humongous_is_live_table(); } // Finally flush all remembered set entries to re-check into the global DCQS. cl.flush_rem_set_entries(); --- 3566,3576 ---- g1_policy()->phase_times()->record_fast_reclaim_humongous_stats(time, cl.total_humongous(), cl.candidate_humongous()); _has_humongous_reclaim_candidates = cl.candidate_humongous() > 0; ! if (_has_humongous_reclaim_candidates || G1TraceEagerReclaimHumongousObjects) { clear_humongous_is_live_table(); } // Finally flush all remembered set entries to re-check into the global DCQS. cl.flush_rem_set_entries();
*** 6182,6192 **** // are currently allocated into. uint region_idx = r->hrm_index(); if (g1h->humongous_is_live(region_idx) || g1h->humongous_region_is_always_live(region_idx)) { ! if (G1TraceReclaimDeadHumongousObjectsAtYoungGC) { gclog_or_tty->print_cr("Live humongous region %u size "SIZE_FORMAT" start "PTR_FORMAT" length "UINT32_FORMAT" with remset "SIZE_FORMAT" code roots "SIZE_FORMAT" is marked %d live-other %d obj array %d", region_idx, obj->size()*HeapWordSize, r->bottom(), r->region_num(), --- 6182,6192 ---- // are currently allocated into. uint region_idx = r->hrm_index(); if (g1h->humongous_is_live(region_idx) || g1h->humongous_region_is_always_live(region_idx)) { ! if (G1TraceEagerReclaimHumongousObjects) { gclog_or_tty->print_cr("Live humongous region %u size "SIZE_FORMAT" start "PTR_FORMAT" length "UINT32_FORMAT" with remset "SIZE_FORMAT" code roots "SIZE_FORMAT" is marked %d live-other %d obj array %d", region_idx, obj->size()*HeapWordSize, r->bottom(), r->region_num(),
*** 6203,6213 **** guarantee(!obj->is_objArray(), err_msg("Eagerly reclaiming object arrays is not supported, but the object "PTR_FORMAT" is.", r->bottom())); ! if (G1TraceReclaimDeadHumongousObjectsAtYoungGC) { gclog_or_tty->print_cr("Dead humongous region %u size "SIZE_FORMAT" start "PTR_FORMAT" length "UINT32_FORMAT" with remset "SIZE_FORMAT" code roots "SIZE_FORMAT" is marked %d live-other %d obj array %d", region_idx, obj->size()*HeapWordSize, r->bottom(), r->region_num(), --- 6203,6213 ---- guarantee(!obj->is_objArray(), err_msg("Eagerly reclaiming object arrays is not supported, but the object "PTR_FORMAT" is.", r->bottom())); ! if (G1TraceEagerReclaimHumongousObjects) { gclog_or_tty->print_cr("Dead humongous region %u size "SIZE_FORMAT" start "PTR_FORMAT" length "UINT32_FORMAT" with remset "SIZE_FORMAT" code roots "SIZE_FORMAT" is marked %d live-other %d obj array %d", region_idx, obj->size()*HeapWordSize, r->bottom(), r->region_num(),
*** 6244,6255 **** }; void G1CollectedHeap::eagerly_reclaim_humongous_regions() { assert_at_safepoint(true); ! if (!G1ReclaimDeadHumongousObjectsAtYoungGC || ! (!_has_humongous_reclaim_candidates && !G1TraceReclaimDeadHumongousObjectsAtYoungGC)) { g1_policy()->phase_times()->record_fast_reclaim_humongous_time_ms(0.0, 0); return; } double start_time = os::elapsedTime(); --- 6244,6255 ---- }; void G1CollectedHeap::eagerly_reclaim_humongous_regions() { assert_at_safepoint(true); ! if (!G1EagerReclaimHumongousObjects || ! (!_has_humongous_reclaim_candidates && !G1TraceEagerReclaimHumongousObjects)) { g1_policy()->phase_times()->record_fast_reclaim_humongous_time_ms(0.0, 0); return; } double start_time = os::elapsedTime();
< prev index next >