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: AtomicBoolSet 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>
impl<VM: VMBinding> GCTrigger<VM>
pub fn new( options: Arc<Options>, scheduler: Arc<GCWorkScheduler<VM>>, state: Arc<GlobalState>, ) -> Self
sourcepub fn set_plan(&mut self, plan: &'static dyn Plan<VM = VM>)
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.
fn plan(&self) -> &dyn Plan<VM = VM>
sourcefn request(&self)
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).
sourcepub fn clear_request(&self)
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.
sourcepub fn poll(&self, space_full: bool, space: Option<&dyn Space<VM>>) -> bool
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 couldNoneif the poll is not triggered by a space.
sourcepub fn handle_user_collection_request(
&self,
force: bool,
exhaustive: bool,
) -> bool
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.
sourcepub fn trigger_internal_collection_request(&self)
pub fn trigger_internal_collection_request(&self)
MMTK has requested stop-the-world activity (e.g., stw within a concurrent gc).
pub fn should_do_stress_gc(&self) -> bool
sourcepub(crate) fn should_do_stress_gc_inner(
state: &GlobalState,
options: &Options,
) -> bool
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.
sourcepub fn is_heap_full(&self) -> bool
pub fn is_heap_full(&self) -> bool
Check if the heap is full
sourcepub fn get_max_nursery_bytes(&self) -> usize
pub fn get_max_nursery_bytes(&self) -> usize
Return upper bound of the nursery size (in number of bytes)
sourcepub fn get_min_nursery_bytes(&self) -> usize
pub fn get_min_nursery_bytes(&self) -> usize
Return lower bound of the nursery size (in number of bytes)
sourcepub fn get_max_nursery_pages(&self) -> usize
pub fn get_max_nursery_pages(&self) -> usize
Return upper bound of the nursery size (in number of pages)
sourcepub fn get_min_nursery_pages(&self) -> usize
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> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
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>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
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)
fn as_any(&self) -> &(dyn Any + 'static)
&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)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&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
impl<T> DowncastSend for T
§impl<T> DowncastSync for T
impl<T> DowncastSync for T
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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