Christian Wimmer

Unrestricted and Safe Dynamic Code Evolution for Java

Thomas Würthinger, Christian Wimmer, Lukas Stadler: Unrestricted and Safe Dynamic Code Evolution for Java. In Science of Computer Programming, volume 78, issue 5, pages 481–498. Elsevier, 2013. doi:10.1016/j.scico.2011.06.005

Download preprint as PDF

Abstract

Dynamic code evolution is a technique to update a program while it is running. In an object-oriented language such as Java, this can be seen as replacing a set of classes by new versions. We modified an existing high-performance virtual machine to allow arbitrary changes to the definition of loaded classes. Besides adding and deleting fields and methods, we also allow any kind of changes to the class and interface hierarchy. Our approach focuses on increasing developer productivity during debugging, but can also be applied for updating of long-running applications. Changes can be applied at any point a Java program can be suspended.

Our virtual machine is able to continue execution of old changed or deleted methods and also to access deleted static fields. A dynamic verification of the current state of the program ensures type safety of complex class hierarchy changes. However, the programmer still has to ensure that the semantics of the modified program are correct and that the new program version can start running from the state left behind by the old program version.

The evaluation section shows that our modifications to the virtual machine have no negative performance impact on normal program execution. The in-place instance update algorithm is in many cases faster than a full garbage collection. Standard Java development environments automatically use the code evolution features of our modified virtual machine, so no additional tools are required.