K Virtual Machine and its architecture:
A Java virtual machine suitable for 32-bit RISC/CISC/DSP
microprocessors and a few megabytes of working memory. Typical products in this
market include screen phones, set-top boxes and high-end PDAs.
A Java virtual machine suitable for 16-bit or 32-bit RISC/CISC microprocessors with a few hundred kilobytes of available memory. Typical products in this market include cell phones, low- to mid-range PDAs and low-end set-top boxes.
Jini TM Java Embedded Server TM
Sun, in conjunction with industry partners, will define and evolve the Java 2 Micro Edition and its configurations. This is done with the JCP (Java Community Process). The Java 2 Micro Edition includes two standard configurations, which are subsets of the Java 2 Standard Edition core APIs, and which will fit in 128k of ROM.
A profile is a collection of Java technology-based class libraries and APIs and a specific configuration that provides domain-specific capabilities for devices in a specific vertical market.
Features of the K Virtual Machine and its APIs
The KVM Specification
Optimized for small size
Easily portable to different platforms
Modular and extensible
Source code base written from scratch
As "complete" and "fast" as possible without significantly increasing footprint.
The Java Virtual Machine Specification
The KVM Optional Features:
The following features defined in The Java Virtual Machine Specification are optional in the KVM architecture. In each case, a feature is designated "optional" because:
The applications designed for a particular configuration (or class of device) do not need the feature.
Elimination of the feature significantly reduces memory footprint or enables some other cost savings or necessary functionality in the class of device targeted by that configuration.
Features not explicitly identified in the following list are required and must be implemented in all configurations.
Large data types: long, float, and double -- many configurations do not need the extended range and precision of the larger data types.
Multi-dimension arrays -- many configurations do not need to support arrays of more that one dimension.
Class file verification -- some specified configurations may not need to support on-device verification of class files. Instead technology is planned to be developed to enable class files to be efficiently verified "off-line" and delivered to the device.
Handling of Error classes -- when the Java virtual machine encounters a serious internal problem, it throws an instance of a subclass of java.lang.Error. However, because there is often no reasonable form of programmatic recovery from these errors, a configuration may specify the KVM to halt with a configuration-defined error indication. Or the configuration may allow device vendors to define device-specific behavior and recovery actions when it encounters such conditions.
Threads and event handling -- some configurations may require a different application execution model from the standard Java technology-based model using the Thread class and standard event handling.
Java Native Interface (JNI) -- many configurations might not need the flexibility of the JNI for the way in which native methods are linked and invoked. A configuration may use a defined alternative, simpler mechanism to invoke native methods.
Class loaders -- many configurations might not need the full flexibility of Java class loaders. A configuration must specify the mechanisms by which classes are located and loaded into the KVM.
Finalization -- many configurations do not need to support object finalization.
Maximum size limitations -- many configurations do not need to support the full range of sizes of internal virtual machine data structures. A
configuration may specify a "maximum supported" range for some or all of the following values:
The number of classes in a package
The number of interfaces implemented by a class
The number of fields in a class
The number of methods in a class
The number of elements in an array
The number of bytes of code per method
The length of a string in a CONSTANT_UTF8 constant pool entry
The maximum amount of stack that a method may use
The maximum number of locals that a method may use
Start-up -- each configuration must specify how the KVM locates the initial class and method to execute and the expected attributes of that class and method.
Design Considerations for the KVM
Host System Calls
Graphics are currently implemented by calling platform-specific graphics functions. There is no support for AWT, Project Swing, or any other high-level graphics libraries.
Another space-reducing tactic was implementing the KVM in C. However, we also minimized the number of C runtime functions that the virtual machine calls in order to ease implementation or replacement of those functions. If any of the debugging modes in the source code are enabled, then the target platform must support the fprintf function in the standard C I/O library ( stdio), or a function with the same interface as fprintf.
KVM Platform Debug Architecture:
Based on existing JDWP (Java Debug Wire Protocol)
Memory-intensive operations moved to Debug Agent (aka Debug Proxy) on Desktop Workstation
KVM implements subset of JDPW command set (KDWP)
Write once, run anywhere:
Overall, I am impressed by the J2ME concept and the KVM implementation. Some initial concerns about garbage collection were addressed in release 1.0.3. And, though the new collector is not deterministic, it is far more responsive and respectable than its predecessor.
One remaining complaint concerns the threading model, which has yet to be improved in any update. Under KVM, each Java thread executes a fixed number of bytecodes before being preempted by the scheduler. This overly simplistic round-robin approach needs to be replaced by a priority-based preemptive scheduler to make KVM more than just a platform for experimentation.
Additionally, the virtual machine enhancements suggested in the Real-Time Specification for Java (link is external) would greatly enhance the value of KVM to real-time developers. Some of the proposals address determinism, others garbage collection and thread scheduling. Perhaps now that KVM's source code is out there, a helpful individual or group will come along and make these changes for the benefit of all.
In summary, KVM represents something close to a JVM embedded programmers could live with. There are still some issues of efficiency and determinism to deal with, but those are not of universal concern. By putting the trade-offs of size vs. portability in the hands of the developers-and in the process, minimizing insistence on portability at all cost-Sun has given us a very nice way to run Java programs on simpler processors with far less memory than ever before. And J2ME's configurations and profiles provide a flexible roadmap for achieving a desired level of portability at a more reasonable cost.