Dynamic Code Evolution for Java

Thomas Würthinger
Institute for System Software
wuerthinger@ssw.jku.at


Abstract

Dynamic code evolution allows changes to the behavior of a running program. The program is temporarily suspended, the programmer changes its code, and then the execution continues with the new version of the program. The code of a Java program consists of the definitions of Java classes.

This thesis describes a novel algorithm for performing unlimited dynamic class redefinitions in a Java virtual machine. The supported changes include adding and removing fields and methods as well as changes to the class hierarchy. Updates can be performed at any point in time and old versions of currently active methods will continue running.

Type safety violations of a change are detected and cause the redefinition to fail gracefully. Additionally, an algorithm for calling deleted methods and accessing deleted static fields improves the behavior in case of inconsistencies between running code and new class definitions. The thesis also presents a programming model for safe dynamic updates and discusses useful update limitations that allow a programmer to reason about the semantic correctness of an update. Specifications of matching code regions between two versions of a method reduce the time old code is running.

All algorithms are implemented in Oracle's Java HotSpot™ VM. The evaluation shows that the new features do not have a negative impact on the peak performance before or after a dynamic change.

Kurzfassung

Dynamische Evolution ermöglicht den Eingriff in das Verhalten eines laufenden Programms. Das Programm wird temporär angehalten, der Programmierer verändert den Quelltext und dann wird die Ausführung mit der neuen Programm-Version fortgesetzt. Der Quelltext von Java-Programmen besteht aus den Definitionen von Java-Klassen.

Diese Arbeit beschreibt einen neuartigen Algorithmus für die unlimitierte dynamische Neudefinition von Java-Klassen in einer virtuellen Maschine. Die unterstützten Änderungen beinhalten das Hinzufügen und Entfernen von Feldern und Methoden sowie Veränderungen der Klassenhierarchie. Der Zeitpunkt der Veränderung ist nicht beschränkt und die aktuell laufenden Ausführungen von alten Versionen einer Methode werden fortgesetzt.

Mögliche Verletzungen der Typsicherheit werden erkannt und führen zu einem Abbruch der Neudefinition. Ein Algorithmus für das Aufrufen von gelöschten Methoden und für den Zugriff auf gelöschte statische Felder verbessert das Verhalten im Fall von Inkonsistenzen zwischen den gerade laufenden Methoden und den neuen Klassendefinitionen. Die Arbeit präsentiert auch ein Programmiermodell für sichere dynamische Aktualisierungen und diskutiert nützliche Limitierungen, die es dem Programmierer ermöglichen, über die semantische Korrektheit einer Aktualisierung Schlussfolgerungen zu ziehen. Die Angabe von gleichartigen Quelltextbereichen zwischen zwei Versionen einer Methode reduzieren die Zeit, in der noch alte Methoden ausgeführt werden.

Alle Algorithmen sind in der Java HotSpot™ VM von Oracle implementiert. Die Evaluierung zeigt, dass die neuen Fähigkeiten weder vor noch nach einer dynamischen Veränderung einen negativen Einfluss auf die Spitzenleistung der virtuellen Maschine haben.


PhD thesis, Johannes Kepler University Linz, March 2011.

Download as PDF