Abstract
We modify the Sun JDK1.2 to provide transparent fault-tolerance for many Java applications using a primary-backup architecture. We identify the sources of non-determinism in the JVM (including asynchronous exceptions, multi-threaded access to shared data, and the non-determinism present at the native method interface) and guarantee that primary and backup handle them identically. We analyze the overhead introduced in our system by each of these sources of non-determinism and compare the performance of different techniques for handling multithreading.