Computer systems with which we interact on a daily basis consist of a vast diversity of devices. At the low end, battery-powered, handheld devices with limited resources, e.g., personal digital assistants (PDAs), smartphones, etc., are common and extremely popular. At the high end, powerful, multi- and many-core processor systems are increasingly ubiquitous in the laptops, deskside computers, workstations, and clusters that we use. The pervasiveness of heterogeneous systems requires that there be programming languages for application development, that are easy to learn and use, portable across diverse systems, and that facilitate extraction of high performance from the underlying, available device technology.
The Java programming language offers many of these characteristics. Its architecture-independent program transfer format and extant virtual machine technology for a wide variety of devices, provides programmers with a write once and run anywhere (WORA) model. Moreover, its object-orientation, robust library support, and high-level syntax, make Java easy to learn and develop applications with. Finally, modern virtual machine (VM) technology offers powerful adaptive services that comibine program profiling and optimization, to extract high performance from applications with frequently executed code regions (hot spots). However, the Java language and its VM technology to date have not targeted device-specific opportunities that have the potential for enabling both programmer productivity and scalable high performance.
In this dissertation, we investigate potential opportunities for devices at the two ends of the performance spectrum: battery-powered, handheld PDAs and parallel processing systems. Our thesis question asks whether we can employ adaptive JVM technologies to improve the performance of programs in resource-constrained devices and to facilitate efficient and scalable parallel programming in multi-core systems. We address each question with a specific and novel solution: (1) adaptive compiled code management for low end devices, and (2) adaptive code parallelization for high end, multiprocessing systems. The goal of our work is to extract high performance from the underlying device technology through novel JVM extensions while maintaining the ease-of-use of the Java programming language. We describe each of our foci in detail and present empirical evidence of its efficacy and potential.