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§

source

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.
source

fn is_heap_full(&self, plan: &dyn Plan<VM = VM>) -> bool

Is current heap full?

source

fn get_current_heap_size_in_pages(&self) -> usize

Return the current heap size (in pages)

source

fn get_max_heap_size_in_pages(&self) -> usize

Return the upper bound of heap size

source

fn can_heap_size_grow(&self) -> bool

Can the heap size grow?

Provided Methods§

source

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.

source

fn on_gc_start(&self, _mmtk: &'static MMTK<VM>)

Inform the triggering policy that a GC starts.

source

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().

source

fn on_gc_end(&self, _mmtk: &'static MMTK<VM>)

Inform the triggering policy that a GC ends.

Implementors§