Index on 8 byte chunks instead of individual bytes. This works because all pool stot sizes are pointer aligned, so all sizes in an 8 byte range map to the same heap.eightbitraptor (Matt V-H)
Previously, every object allocation in rb_gc_impl_new_obj made a per-object FFI call into Rust (mmtk_add_obj_free_candidate), which acquired a mutex on one of the WeakProcessor's candidate vecs, pushed a single element, and released the ...eightbitraptor (Matt V-H)
shutdown_call_finalizer reads candidates from the Rust-side WeakProcessor, but the main ractor's C-side buffer may not have been flushed yet (ractor_cache_free runs later). Flush all remaining buffers before reading candidates. https://...eightbitraptor (Matt V-H)
Instead of sending all 128 buffered objects to one bucket, round-robin distribute them across all worker buckets so parallel obj_free work stays balanced. https://github.com/ruby/mmtk/commit/e1f926cd21eightbitraptor (Matt V-H)
I think we have spare bits here, so let's expand them out and see what happens. This will allow us to have more than 7 size pools in the futureeightbitraptor (Matt V-H)
Previously classes and modules were pre-aged. Ie. as soon as they're allocated they are aged to old_age - 1. This was done with the assumption that classes are generally always long lived, so we should assume that any that survive a sing...eightbitraptor (Matt V-H)