Go version Workflow GitHub


A more-than-minimal JVM written in Go.

This overview gives the background on this project, including its aspirations and the features that it supports. The remaining pages discuss the basics of JVM operation and, where applicable, how Jacobin implements the various steps, noting any items that would be of particular interest to JVM cognoscenti. I’ve included references to the official JVM docs, where I can both as a reference for you, the reader, and for the Jacobin team’s easy reference.


Intended feature set:

  • Java 11 functionality, but…
  • No JNI (Oracle intends to replace it; see JEP 389)
  • No security manager (Oracle intends to remove it; see JEP 411)
  • No JIT
  • Somewhat less stringent bytecode verification

What we’ve done so far and what we need to do:

Command-line parsing

  • Gets options from the three environment variables. Details here
  • Parses the command line; identify JVM options and application options
  • Responds to most options listed in the java -help output

To do:

  • Handling JAR files
  • Handling @files (which contain command-line options)
  • Parsing the classpath

Class loading

  • Correctly reads and parses basic classes
  • Extracts bytecode and params needed for execution

To do:

  • Handle more-complex classes
  • Handle interfaces
  • Handle arrays
  • Handle inner classes
  • Automate loading of core Java classes (Object, etc.)

Verification, Linking, Preparation, Initialization

  • Performs integrity check bytecode is correct.
    This is the focus of current coding work

To do:

  • Linking and verification
  • Preparation
  • Initialization


Not started yet

Garbage Collection

GC is handled by the golang runtime, which has its own GC


The overview page carries a right-side panel that expresses our thanks to vendors and programmers who have made the Jacobin project possible. They are many and we are deeply grateful to them.