Jago
A simplified Java virtual machine written in Go language. One aim is to learn JVM specification in depth and try to understand the behind-the-scene behaviour when a Java program runs.
I only refer to "Java Virtual Machine Specification" and then look into how we should design one. Some production-level features are intentionally ignored and it is supposed to make it as simplified as possible so as to demonstrate the general idea. For the educational purpose, it is more than enough.
If you have no time to read OpenJDK source code or always guess the JVM behaviour when you need to tune your program, then your right here to be the lord of your universe.
Any thought is welcome and I am happy to be wrong.
Roadmap
- Java class file reader
- Interpreter engine
- Class loader delegation
- multi-threading support
- monitor,
sleep,wait,notifysupport - JDK native methods
- GC
- JIT
How to run
build and install
β― cd ~/jago
β― ./build.shBy default, jago will be installed to /usr/local/jago
/usr/local/jago
βββ bin
βΒ Β βββ jago
βββ jdk
βΒ Β βββ classes
βΒ Β βββ META-INF
βΒ Β βββ apple
βΒ Β βββ com
βΒ Β βββ java
βΒ Β βββ javax
βΒ Β βββ jdk
βΒ Β βββ org
βΒ Β βββ sun
βββ log
βββ classloader.log
βββ io.log
βββ misc.log
βββ thread-bootstrap.log
βββ thread-main.log
βββ threads.log
jago command
β― jago -h
NAME:
Jago - A simplified Java Virtual Machine for the educational purpose
USAGE:
jago [-options] class [args...]
VERSION:
1.0.0
DESCRIPTION:
A Java Virtual Machine demonstrating the basic features of execution engine, class loading, type/value system, exception handling, native methods etc.
AUTHOR:
Chao Yang <chaoyangnz@gmail.com>
COMMANDS:
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
--classpath value, --cp value application classpath separated by colon
--noLogo, --nl don't show logo
--debug, -d debug mode
--trace, -t trace mode
--log:thread value log level of instruction execution in a thread context, options: info, debug, trace
--log:classloader value log level of class loading, options: info, debug, trace
--profile, -p profile jago
--help, -h show help
--version, -v print the versionRun a calendar program
β― jago --log:thread info -cp . Calendar 8 2018Run a pyramid program
β― jago --log:thread info -cp . Pyramidrun a program traversing a tree in the level order
β― jago --log:thread info -cp . TreeLevelOrderTraverseRun a program into exception
β― jago --log:thread info -cp . test/test_athrowMore examples to demonstrate features
- Print system properties
jago -d test.test_system_properties- Multi-threading
jago -d test.test_threadjago -d Multithread- Thread sleep or
wait/interrupt
jago -d SleepInterruptjago -d WaitInterrupt- Java monitor lock with
synchronized
jago -d Counter- Java wait() and
notify(),notifyAll()
jago -d ProducerConsumertrace the execution
log/thread-[name].log
This log file records the each instruction execution and method call hierarchy within a thread context. Set the log level to info to view call hierarchy more clearly.
The blue diamond symbol
The fire symbol athrow bytecode, rethrown if uncaught or thrown by VM internally), while the blue water symbol
- TRACE: log all low level bytecode instructions, method call and exception thrown/caught
- DEBUG: only method call and exception thrown/caught
- INFO: only exception thrown/caught info
log/classloader.log
This log file records the class loading process, including what triggers a class loading and when its class initialization method <clinit> is invoked. The trigger reason can be viewed after a class name.
log/threads.log
This log file records thread creation/exit information and object monitor enter/exit, thread sleep(), wait(), notify() etc.
log/io.log
This log file records I/O details around system interactions.
log/misc.log
Other trivial logs
Profiling
https://flaviocopes.com/golang-profiling/
- run jago with
-poption go tool pprof --pdf /usr/local/bin/jago /var/../cpu.pprof > cpu.pdf
Documentation
Really sorry, I have no time to write documentation but it is in my plan. The Ebook about how it works internally is in progress: https://www.gitbook.com/book/richdyang/go-my-jvm








