Getting a Handle on Unmanaged Memory
Nick Wanninger, Tommy McMichen, Simone Campanoni, Peter Dinda
TL;DR
Unmanaged languages suffer from heap fragmentation due to immovable allocations. The paper presents ALASKA, a compiler/runtime co-design that transparently introduces handle-based object mobility, enabling compacting-like defragmentation in C/C++ without code changes. It introduces Anchorage, an extensible defragmenting service built atop a simple handle-table runtime and stop-the-world barriers. The evaluation across benchmarks and Redis shows a geomean overhead of about $10\%$ and fragmentation reductions up to $40\%$, demonstrating practical viability and portability of the approach. The work highlights a path toward bringing managed-runtime memory strategies to unmanaged languages.
Abstract
The inability to relocate objects in unmanaged languages brings with it a menagerie of problems. Perhaps the most impactful is memory fragmentation, which has long plagued applications such as databases and web servers. These issues either fester or require Herculean programmer effort to address on a per-application basis because, in general, heap objects cannot be moved in unmanaged languages. In contrast, managed languages like C# cleanly address fragmentation through the use of compacting garbage collection techniques built upon heap object movement. In this work, we bridge this gap between unmanaged and managed languages through the use of handles, a level of indirection allowing heap object movement. Handles open the door to seamlessly employ runtime features from managed languages in existing, unmodified code written in unmanaged languages. We describe a new compiler and runtime system, ALASKA, that acts as a drop-in replacement for malloc. Without any programmer effort, the ALASKA compiler transforms pointer-based code to utilize handles, with optimizations to reduce performance impact. A codesigned runtime system manages this level of indirection and exploits heap object movement via an extensible service interface. We investigate the overheads of ALASKA on large benchmarks and applications spanning multiple domains. To show the power and extensibility of handles, we use ALASKA to eliminate fragmentation on the heap through compaction, reducing memory usage by up to 40% in Redis.
