We have implemented a virtual machine (VM) for Java which executes on a cluster. Our cluster VM completely hides the cluster
from the application, presenting a single system image (SSI) (i.e., the application sees a traditional virtual machine). At
the same time it leverages the cluster to achieve improved performance for a range of applications. We show how the flexibility
and constraints of the Java Virtual Machine (JVM) Specification [7] impacted the design of our cluster VM. We describe issues related to class loading and distribution-aware implementations
of the bytecodes. We also point out the limits on providing a solution for completely transparent distribution of multi-threaded
Java applications if one does not modify the VM or the core classes.