Why Nothing Matters: The Impact of Zeroing

  • Xi Yang ,
  • Stephen M. Blackburn ,
  • Daniel Frampton ,
  • Jennifer Sartor ,
  • Kathryn S McKinley

Published by ACM SIGPLAN Conference on Object-Oriented Programming, Systems, Languages, and Applications (OOPSLA)

Memory safety defends against inadvertent and malicious misuse of memory that may compromise program correct- ness and security. A critical element of memory safety is zero initialization. The direct cost of zero initialization is surprisingly high: up to 12.7%, with average costs ranging from 2.7 to 4.5% on a high performance virtual machine on IA32 architectures. Zero initialization also incurs indirect costs due to its memory bandwidth demands and cache dis- placement effects. Existing virtual machines either: a) minimize direct costs by zeroing in large blocks, or b) minimize indirect costs by zeroing in the allocation sequence, which reduces cache displacement and bandwidth. This paper evaluates the two widely used zero initialization designs, showing that they make different tradeoffs to achieve very similar performance. Our analysis inspires three better designs: (1) bulk zeroing with cache-bypassing (non-temporal) instructions to reduce the direct and indirect zeroing costs simultaneously, (2) concurrent non-temporal bulk zeroing that exploits parallel hardware to move work off the application’s critical path, and (3) adaptive zeroing, which dynamically chooses between (1) and (2) based on available hardware parallelism. The new software strategies offer speedups some- times greater than the direct overhead, improving total performance by 3% on average. Our findings invite additional optimizations and microarchitectural support.

Why Nothing Matters: The Impact of Zeroing

Managed languages use memory safety to defend against inadvertent and malicious misuse of memory. Unmanaged native languages are increasingly integrating memory safety for the same reasons. A critical element of memory safety is initializing new memory before the program obtains it. Our experiments show that zero initialization is surprisingly expensive in a highly optimized managed runtime — on average the direct cost of zeroing is 4% to 6% and up to 50% of total application time on a variety of modern processors. Zeroing incurs indirect costs as well, which include memory bandwidth consumption and cache displacement. Existing virtual machines (VMs) either: a) minimize direct costs by zeroing in large blocks, or b) minimize indirect costs by integrating zeroing into the allocation sequence to reduce cache…