The JVM used in our experiments is the Sun Labs Virtual Machine for Research, EVM [31]. This is a high performance VM that has been designed to facilitate experiments in memory management. It is designed to provide a fast memory system, fast synchronization, and a fast Just-in-Time (JIT) compiler. It is also an adaptive VM, i.e., it detects and accelerates performance-critical or often-used code. Rather than compiling the entire program when it starts, as is done in virtual machines with pure JIT compilers, the EVM starts off running the application using an interpreter. At the same time, it gathers profiling information regarding the runtime characteristics of the application and uses this information to dynamically compile certain methods. In all our experiments, methods with loops are compiled at the first invocation itself, and methods without loops are compiled when the invocation count reaches 15, a value determined after extensive experimentation [22].
We identify three parts within the EVM, apart from the actual application execution, where the principal events of interest that stress the memory subsystem occur. The first is class loading, when the binary form of a class is brought into the virtual machine on the first invocation, incurring many compulsory cache misses. The second is dynamic method compilation, when a method is converted into native code, and the native code is installed in memory for subsequent execution. This event occurs only in the EVM executing as an adaptive compiler. Finally, there is garbage collection, which runs periodically as a separate thread and reclaims memory from non-referenced objects. A default heap size of 24 megabytes was used in the experiments. The remaining parts have been grouped together with the execution of native code and includes object accesses, thread creation, synchronization, etc.