pub struct MemBalancerTrigger {
    min_heap_pages: usize,
    max_heap_pages: usize,
    current_heap_pages: AtomicUsize,
    pending_pages: AtomicUsize,
    stats: AtomicRefCell<MemBalancerStats>,
}
Expand description

An implementation of MemBalancer (Optimal heap limits for reducing browser memory use, https://dl.acm.org/doi/10.1145/3563323) We use MemBalancer to decide a heap limit between the min heap and the max heap. The current implementation is a simplified version of mem balancer and it does not take collection/allocation speed into account, and uses a fixed constant instead.

Fields§

§min_heap_pages: usize

The min heap size

§max_heap_pages: usize

The max heap size

§current_heap_pages: AtomicUsize

The current heap size

§pending_pages: AtomicUsize

The number of pending allocation pages. The allocation requests for them have failed, and a GC is triggered. We will need to take them into consideration so that the new heap size can accomodate those allocations.

§stats: AtomicRefCell<MemBalancerStats>

Statistics

Implementations§

source§

impl MemBalancerTrigger

source

fn new(min_heap_pages: usize, max_heap_pages: usize) -> Self

source

fn access_stats<F>(&self, f: F)
where F: FnMut(&mut MemBalancerStats),

source

fn compute_new_heap_limit( &self, live: usize, extra_reserve: usize, stats: &mut MemBalancerStats )

Trait Implementations§

source§

impl<VM: VMBinding> GCTriggerPolicy<VM> for MemBalancerTrigger

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. Read more
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.
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?

Auto Trait Implementations§

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>

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

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

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

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

Convert &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)

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

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

§

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

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further 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>,

§

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>,

§

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.