The J9 Virtual Machine (J9VM) was developed by IBM 15 years ago in a clean-room environment to provide an implementation of the virtual machine technology.  Ever since, it has been continuously enhanced and improved, resulting in highly portable and configurable solution, targeting a variety of embedded systems.  Some of the features of the J9VM include:
  • fast interpreter written in assembly
  • support for running on SMP systems
  • easy porting via small operating system/architecture abstraction layer
  • full support for local/remote debugging using JDWP
  • interpreter/JIT mixed mode execution
  • incremental GC with effective compacting
  • statically or dynamically linked
J9VM also provides for a high degree of configuration and tuning, allowing for target-specific optimizations
  • ability to change thread model or scheduler
  • ability to create a space-optimized ROMable image from VM and application
  • ability to remove unused modules, such as debug support, from final image
  • ability to alter default GC and memory settings
Provided as a set of dynamic libraries, J9VM consists of core and optional components, including:

 Name  Required Description
 iverel   ROMable image support
 j9bcv   bytecode verifier
 j9dbg   debug (JVMDI/JDWP) support
 j9dyn  X dynamic loading support
 j9fdm  X math (FDLIBM) library
 j9gc  X garbage collector (GC)
 j9gcchk   GC tracing and monitoring
 j9hookable   proprietary monitor framework
 j9jar2jxe   JXE support
 j9jit  X Just-In-Time (JIT) compiler
 j9jitd   JIT debug support
 j9jpi   profiling (JVMPI) support
 j9prf   proprietary profiling framework
 j9prt  X port-specific layer
 j9rdbi   proprietary debug framework
 j9thr  X threading library
 j9vm  X core functionality
 j9vrb   verbose output
 j9zlib  X compression (ZLIB) library
 jclfoun10_  X implementation of Foundation Profile 1.0
 jclfoun11_  X implementation of Foundation Profile 1.1
 jnichk   JNI tracing and monitoring
 jsig  X linux signal handling
 slprof   proprietary optimizing profiler

A single driver executable (j9) is used during startup to parse command-line options and load the specified profile library.  Multiple Java Class Libraries (JCLs) are supported via -jcl:<profile>, e.g. -jcl:foun11 will use libfoun11_ library, which implements VM support for Foundation Profile 1.1.