Trait mmtk::util::heap::gc_trigger::GCTriggerPolicy
source · pub trait GCTriggerPolicy<VM: VMBinding>: Sync + Send {
// Required methods
fn is_gc_required(
&self,
space_full: bool,
space: Option<SpaceStats<'_, VM>>,
plan: &dyn Plan<VM = VM>
) -> bool;
fn is_heap_full(&self, plan: &dyn Plan<VM = VM>) -> bool;
fn get_current_heap_size_in_pages(&self) -> usize;
fn get_max_heap_size_in_pages(&self) -> usize;
fn can_heap_size_grow(&self) -> bool;
// Provided methods
fn on_pending_allocation(&self, _pages: usize) { ... }
fn on_gc_start(&self, _mmtk: &'static MMTK<VM>) { ... }
fn on_gc_release(&self, _mmtk: &'static MMTK<VM>) { ... }
fn on_gc_end(&self, _mmtk: &'static MMTK<VM>) { ... }
}
Expand description
This trait describes a GC trigger policy. A triggering policy have hooks to be informed about GC start/end so they can collect some statistics about GC and allocation. The policy needs to decide the (current) heap limit and decide whether a GC should be performed.
Required Methods§
sourcefn is_gc_required(
&self,
space_full: bool,
space: Option<SpaceStats<'_, VM>>,
plan: &dyn Plan<VM = VM>
) -> bool
fn is_gc_required( &self, space_full: bool, space: Option<SpaceStats<'_, VM>>, plan: &dyn Plan<VM = VM> ) -> bool
Is a GC required now? The GC trigger may implement its own heuristics to decide when
a GC should be performed. However, we recommend the implementation to do its own checks
first, and always call plan.collection_required(space_full, space)
at the end as a fallback to see if the plan needs
to do a GC.
Arguments:
space_full
: Is any space full?space
: The space that is full. The GC trigger may access some stats of the space.plan
: The reference to the plan in use.
sourcefn is_heap_full(&self, plan: &dyn Plan<VM = VM>) -> bool
fn is_heap_full(&self, plan: &dyn Plan<VM = VM>) -> bool
Is current heap full?
sourcefn get_current_heap_size_in_pages(&self) -> usize
fn get_current_heap_size_in_pages(&self) -> usize
Return the current heap size (in pages)
sourcefn get_max_heap_size_in_pages(&self) -> usize
fn get_max_heap_size_in_pages(&self) -> usize
Return the upper bound of heap size
sourcefn can_heap_size_grow(&self) -> bool
fn can_heap_size_grow(&self) -> bool
Can the heap size grow?
Provided Methods§
sourcefn on_pending_allocation(&self, _pages: usize)
fn on_pending_allocation(&self, _pages: usize)
Inform the triggering policy that we have pending allocation. Any GC trigger policy with dynamic heap size should take this into account when calculating a new heap size. Failing to do so may result in unnecessay GCs, or result in an infinite loop if the new heap size can never accomodate the pending allocation.
sourcefn on_gc_start(&self, _mmtk: &'static MMTK<VM>)
fn on_gc_start(&self, _mmtk: &'static MMTK<VM>)
Inform the triggering policy that a GC starts.
sourcefn on_gc_release(&self, _mmtk: &'static MMTK<VM>)
fn on_gc_release(&self, _mmtk: &'static MMTK<VM>)
Inform the triggering policy that a GC is about to start the release work. This is called
in the global Release work packet. This means we assume a plan
do not schedule any work that reclaims memory before the global Release
work. The current plans
satisfy this assumption: they schedule other release work in plan.release()
.