mmtk::util::heap::gc_trigger

Struct GCTrigger

source
pub struct GCTrigger<VM: VMBinding> {
    plan: MaybeUninit<&'static dyn Plan<VM = VM>>,
    pub policy: Box<dyn GCTriggerPolicy<VM>>,
    request_flag: AtomicBool,
    scheduler: Arc<GCWorkScheduler<VM>>,
    options: Arc<Options>,
    state: Arc<GlobalState>,
}
Expand description

GCTrigger is responsible for triggering GCs based on the given policy. All the decisions about heap limit and GC triggering should be resolved here. Depending on the actual policy, we may either forward the calls either to the plan or to the binding/runtime.

Fields§

§plan: MaybeUninit<&'static dyn Plan<VM = VM>>

The current plan. This is uninitialized when we create it, and later initialized once we have a fixed address for the plan.

§policy: Box<dyn GCTriggerPolicy<VM>>

The triggering policy.

§request_flag: AtomicBool

Set by mutators to trigger GC. It is atomic so that mutators can check if GC has already been requested efficiently in poll without acquiring any mutex.

§scheduler: Arc<GCWorkScheduler<VM>>§options: Arc<Options>§state: Arc<GlobalState>

Implementations§

source§

impl<VM: VMBinding> GCTrigger<VM>

source

pub fn new( options: Arc<Options>, scheduler: Arc<GCWorkScheduler<VM>>, state: Arc<GlobalState>, ) -> Self

source

pub fn set_plan(&mut self, plan: &'static dyn Plan<VM = VM>)

Set the plan. This is called in create_plan() after we created a boxed plan.

source

fn plan(&self) -> &dyn Plan<VM = VM>

source

fn request(&self)

Request a GC. Called by mutators when polling (during allocation) and when handling user GC requests (e.g. System.gc(); in Java).

source

pub fn clear_request(&self)

Clear the “GC requested” flag so that mutators can trigger the next GC. Called by a GC worker when all mutators have come to a stop.

source

pub fn poll(&self, space_full: bool, space: Option<&dyn Space<VM>>) -> bool

This method is called periodically by the allocation subsystem (by default, each time a page is consumed), and provides the collector with an opportunity to collect.

Arguments:

  • space_full: Space request failed, must recover pages within ‘space’.
  • space: The space that triggered the poll. This could None if the poll is not triggered by a space.
source

pub fn handle_user_collection_request( &self, force: bool, exhaustive: bool, ) -> bool

This method is called when the user manually requests a collection, such as System.gc() in Java. Returns true if a collection is actually requested.

§Arguments
  • force: If true, we force a collection regardless of the settings. If false, we only trigger a collection if the settings allow it.
  • exhaustive: If true, we try to make the collection exhaustive (e.g. full heap collection). If false, the collection kind is determined internally.
source

pub fn trigger_internal_collection_request(&self)

MMTK has requested stop-the-world activity (e.g., stw within a concurrent gc).

source

pub fn should_do_stress_gc(&self) -> bool

source

pub(crate) fn should_do_stress_gc_inner( state: &GlobalState, options: &Options, ) -> bool

Check if we should do a stress GC now. If GC is initialized and the allocation bytes exceeds the stress factor, we should do a stress GC.

source

pub fn is_heap_full(&self) -> bool

Check if the heap is full

source

pub fn get_max_nursery_bytes(&self) -> usize

Return upper bound of the nursery size (in number of bytes)

source

pub fn get_min_nursery_bytes(&self) -> usize

Return lower bound of the nursery size (in number of bytes)

source

pub fn get_max_nursery_pages(&self) -> usize

Return upper bound of the nursery size (in number of pages)

source

pub fn get_min_nursery_pages(&self) -> usize

Return lower bound of the nursery size (in number of pages)

Auto Trait Implementations§

§

impl<VM> !Freeze for GCTrigger<VM>

§

impl<VM> !RefUnwindSafe for GCTrigger<VM>

§

impl<VM> Send for GCTrigger<VM>

§

impl<VM> Sync for GCTrigger<VM>

§

impl<VM> Unpin for GCTrigger<VM>

§

impl<VM> !UnwindSafe for GCTrigger<VM>

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Converts Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Converts Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Converts &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Converts &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSend for T
where T: Any + Send,

§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts Box<Trait> (where Trait: DowncastSend) to Box<dyn Any + Send>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

§

fn into_any_sync(self: Box<T>) -> Box<dyn Any + Sync + Send>

Converts Box<Trait> (where Trait: DowncastSync) to Box<dyn Any + Send + Sync>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Converts Arc<Trait> (where Trait: DowncastSync) to Arc<Any>, which can then be downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

source§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.