diff --git a/src/policy/immix/defrag.rs b/src/policy/immix/defrag.rs index 4f56a5e3c1..2712044237 100644 --- a/src/policy/immix/defrag.rs +++ b/src/policy/immix/defrag.rs @@ -73,13 +73,15 @@ impl Defrag { exhausted_reusable_space: bool, full_heap_system_gc: bool, stress_defrag: bool, + immix_util: Option, ) { let in_defrag = defrag_enabled && (emergency_collection || (collection_attempts > 1) || !exhausted_reusable_space || stress_defrag - || (collect_whole_heap && user_triggered && full_heap_system_gc)); + || (collect_whole_heap && user_triggered && full_heap_system_gc)) + || (immix_util.is_some() && immix_util.unwrap() < 0.2); info!("Defrag: {}", in_defrag); probe!(mmtk, immix_defrag, in_defrag); self.in_defrag_collection diff --git a/src/policy/immix/immixspace.rs b/src/policy/immix/immixspace.rs index 08805df817..9cacd5c029 100644 --- a/src/policy/immix/immixspace.rs +++ b/src/policy/immix/immixspace.rs @@ -415,6 +415,16 @@ impl ImmixSpace { self.reusable_blocks.len() == 0, full_heap_system_gc, *self.common.options.immix_always_defrag, + if *self.common.options.count_live_bytes_in_gc { + let stats = self.common.global_state.live_bytes_in_last_gc.borrow(); + if let Some(immix_stats) = stats.get(&self.name()) { + Some(immix_stats.live_bytes as f64 / immix_stats.used_bytes as f64) + } else { + None + } + } else { + None + } ); self.defrag.in_defrag() }