1.7 KiB
1.7 KiB
Using VMKit as BDWGC replacement
VMKit provides a BDWGC API shim which allows you to use VMKit as a drop-in replacement for BDWGC. In most of the cases it runs out of the box without any changes and provides 2-3x performance improvement.
How to use
- Build VMKit with
--features uncooperative
and then installlibvmkit.so
fromtarget/release
ortarget/debug
in a way that pkg-config or build system of your project can find it. - Swap
-lgc
with-lvmkit
in your build command. - Done.
Notes
- VMKit does not support every feature of BDWGC, some shims are no-ops.
- It is necessary to manually call
GC_init()
on program startup. - We do not redirect pthread functions, use
GC_pthread_*
functions directly or register your threads withGC_register_my_thread()
andGC_unregister_my_thread()
. GC_pthread_create
will wait for thread to be started and registered with GC.- Dynamic library support is minimal: we simply invoke
dl_iterate_phdr()
to scan loaded data segments for GC roots. - Finalization is not yet implemented, only disappearing links are provided.
- Interior pointers are limited to displacement of 128 bytes from base pointer.
Implementation
BDWGC shim is implemented in src/bdwgc_shim.rs
. We simply map all APIs to MemoryManager
methods
or other functions from mmtk
crate. Since MMTk requires all objects to provide scan
method,
each allocated object actually stores a vtable with necessary metadata to implement it. This vtable
is stored in the object header, right behind the object payload.
Thread suspension is implemented using pthread_kill
, the mechanism is similar to that of BDWGC, but we
rely on sigsuspend
instead of spin waiting.