diff --git a/dora-runtime/src/gc/swiper/controller.rs b/dora-runtime/src/gc/swiper/controller.rs index 357acbf25..d75b083af 100644 --- a/dora-runtime/src/gc/swiper/controller.rs +++ b/dora-runtime/src/gc/swiper/controller.rs @@ -95,10 +95,12 @@ pub fn stop( std::usize::MAX }; + let min_semi_size = young.allocated_size(); + let rest = config.max_heap_size - config.old_size; let target_young_size = rest / 2; let target_young_size = min(target_young_size, max_young_size); - let target_young_size = max(target_young_size, 2 * PAGE_SIZE); + let target_young_size = max(target_young_size, 2 * min_semi_size); let young_size = align_page_down(target_young_size / 2) * 2; if old_size + young_size > config.max_heap_size { diff --git a/dora-runtime/src/gc/swiper/old.rs b/dora-runtime/src/gc/swiper/old.rs index e6fe13ab5..391e9aabb 100644 --- a/dora-runtime/src/gc/swiper/old.rs +++ b/dora-runtime/src/gc/swiper/old.rs @@ -187,6 +187,7 @@ impl OldGenProtected { if let Some(page) = self.allocate_page(vm) { self.pages.push(page); self.pages.sort(); + self.size += PAGE_SIZE; self.top = page.object_area_start(); self.current_limit = page.object_area_end(); @@ -210,6 +211,7 @@ impl OldGenProtected { .position(|&p| p == page) .expect("missing page"); self.pages.swap_remove(idx); + self.size -= PAGE_SIZE; os::discard(page.start(), page.size()); } diff --git a/dora-runtime/src/gc/swiper/young.rs b/dora-runtime/src/gc/swiper/young.rs index cd13af195..99c85337f 100644 --- a/dora-runtime/src/gc/swiper/young.rs +++ b/dora-runtime/src/gc/swiper/young.rs @@ -130,6 +130,12 @@ impl YoungGen { self.current_size.store(size, Ordering::Relaxed); } + pub fn allocated_size(&self) -> usize { + let protected = self.alloc.protected.lock(); + let to_committed = self.to_committed(); + protected.current_limit.offset_from(to_committed.start()) + } + pub fn protect_from(&self) { if cfg!(debug_assertions) || self.protect { let from_space = self.from_committed(); diff --git a/dora-runtime/src/object.rs b/dora-runtime/src/object.rs index ef04c1178..469e7070b 100644 --- a/dora-runtime/src/object.rs +++ b/dora-runtime/src/object.rs @@ -672,10 +672,11 @@ where let cls = vm.class_instances.idx(clsid); let vtable = cls.vtable.read(); let vtable: &VTable = vtable.as_ref().unwrap(); - let mut handle: Ref = ptr.into(); + let handle: Ref = ptr.into(); handle - .header_mut() + .header() .set_vtblptr(Address::from_ptr(vtable as *const VTable)); + handle.header().set_metadata_raw(0); handle }