Virtual machines (VMs) play an important role in mainstream computing by enabling interoperability, security, and higher levels of abstraction. Their use in embedded computing systems is deterred primarily by the resource constraints of embedded microcontrollers. In this paper, we show how various optimizations can significantly decrease these overheads, making VMs viable as system software for even low-end (8- or 16-bit) microcontrollers. We identify key performance-oriented design principles and quantify their effects by incorporating them in an existing sensor network virtual machine.