The Java bytecode language is emerging as a software distribution
standard. With major vendors committed to porting the Java run-
time environment to their platforms, Java bytecode programs are
expected to run without modification on multiple platforms. These
first generation run-time environments rely on an interpreter to
bridge the gap between the bytecode instructions and the native
hardware. However, Java interpreters cause performance problems
with microarchitectural features such as the caches and Branch
target Buffer. Some of these problems can be solved by translating
Java bytecode to native code. In this paper we compare the
performance of code run through the SUN Java interpreter to code
compiled through Caffeine, a bytecode to native code translator,
as well as to compiled C/C++ versions of the code, using large
applications and common benchmarks. We discuss the reasons for
several performance problems incurred by both approaches to running
Java code, and examine possible solutions.