A technical story for a kid who speaks Java fluently
Narrator (you): The terminal blinks. You type:
java -Xms256m -Xmx2g -server MyGameAnd press Enter.
Kid: Thatβs it? Thatβs when the magic starts?
You: π₯ Thatβs when the JVM is born.
π Phase 1: Birth β JVM Startup
The OS loads the JVM executable (java β libjli.dylib/jli.dll β libjvm.so) into memory.
β JVM Initialization begins:
- Allocates process memory (heap, metaspace, thread stacks, native memory).
- Parses VM flags:
-
-Xms256m: "Reserve 256 MB right now for the heap." -
-Xmx2g: "But you *may grow up to 2 GB β ask the OS nicely."* -
-server: "Use the Server VM β C2 JIT, parallel GC, biased lockingβ¦ weβre in for the long haul."
-
β‘οΈ HotSpot VM (Oracleβs implementation) boots its internal subsystems:
-
Threads: Creates the main thread, compiler threads (
C1,C2), GC threads (e.g., G1 concurrent mark), service threads. - Memory Managers: Sets up heap regions (for G1: 2048 regions, ~1 MB each), metaspace (native memory for class metadata), code cache (for JITβd native code).
-
Runtime: Initializes
java.lang.System,java.lang.Thread, signal handlers.
Kid: Wait β no classes yet?
You: None! Just the machine is ready. Now⦠it needs its first instruction.
π Phase 2: The Quest Begins β Loading MyGame
The JVM now must run MyGame.main(String[]).
But MyGame.class is just a file β a binary container in the *class file format* (per JVM Spec Β§4).
π Class Loading: Delegation in Action
Application Class Loader says:
βIβm in charge ofMyGame. But first β ask my parent.β
β Delegates to Extension Class Loader.Extension CL says:
βNot injre/lib/ext? Then ask *my parent.β*
β Delegates to Bootstrap Class Loader.-
Bootstrap CL (native, written in C):
β Scansjre/lib(e.g.,rt.jar, nowmodulesin JDK 9+).
β Loads core:java/lang/Object.class,java/lang/Class.class,java/lang/String.class, β¦
β Builds their in-memory representations:-
Klass*structures (C++ objects inside HotSpot) - Method tables, vtables, constant pools
- Links
ObjectβClassβClassLoader
-
-
Now back down:
- Extension CL loads any JCE providers, etc.
-
Application CL finally loads
MyGame.classfrom the classpath.
π Deep Dive Moment:
The.classfile is parsed into:
magic: 0xCAFEBABEβminor/major version(e.g., 61.0 = Java 17)constant_pool[]: 50 entries β#1 = Methodref: java/lang/Object."<init>":()V,#15 = Utf8: "Hello", etc.fields[],methods[],attributes[](likeCode,LineNumberTable)
π§ͺ Phase 3: Linking β Making Sense of the Scroll
Now MyGame is loaded β but not yet trusted.
Step 1: Verification (Bytecode Verifier β Type 2)
The JVM checks:
- No jumps into the middle of instructions.
- Stack maps: βAt instruction 12, stack must be [I, Ljava/lang/String;]β
- No
getfieldonnull. No type mismatches. β If fails?java.lang.VerifyErrorβ βThis scroll is cursed!β
Step 2: Preparation
- Allocates memory for static fields:
static int score = 0; // β set to 0 (default)
static String name; // β set to null
β Stored in the static field section of the InstanceKlass.
Step 3: Resolution
For every symbolic reference in the constant pool:
-
#23 = Class: GameEngineβ resolve to actualKlass*(triggers loading GameEngine! β recursive!) -
#25 = Methodref: GameEngine.start:()Vβ resolve to method holder + vtable index.
π This may cascade: loading GameEngine β loads Player β loads java/util/ArrayList β β¦ until the entire dependency tree is linked.
Kid: So linking can load more classes?
You: Yes! Like pulling one thread β the whole sweater unfolds.
β¨ Phase 4: Initialization β The First Spark
Now the JVM calls:
MyGame.<clinit>() // class initializer
- Executes static initializers in textual order:
static {
score = 100;
name = "Hero";
engine = new GameEngine(); // β triggers *GameEngine.<clinit>* and *GameEngine.<init>*
}
β‘οΈ Objects are born in the heap:
-
new GameEngine()β- Allocates raw memory (TLAB β Thread-Local Allocation Buffer, fast path!)
- Zeroes fields
- Sets
klasspointer (metadata) - Runs
<init>(constructor)
Heap layout (simplified HotSpot):
[ Mark Word (64b) | Klass Pointer (compressed oop) | fields⦠]
π Fun Fact:
If heap is full and no GC can recover space during allocation?
βOutOfMemoryError: Java heap spaceβ even before main() starts!
π Phase 5: Running main() β The Engine Ignites
Finally β the JVM invokes:
MyGame.main({}) // String[] args = empty
β‘οΈ A new frame is pushed onto the main threadβs Java Stack.
Frame layout:
[ Local Variables (0: args ref) ]
[ Operand Stack (empty) ]
[ Frame Data (return PC, previous frame pointer) ]
Now the Execution Engine takes over.
First, the Interpreter runs bytecode:
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3 // String "Game starting..."
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
...
Each instruction:
- Pops values from operand stack
- Does work (e.g., resolve field, call method)
- Pushes results back
Itβs safe. Itβs portable. Itβsβ¦ slow.
But the JVM is watching.
π Phase 6: JIT Compilation β The Speed Awakening
The HotSpot (profiling data) notices:
- Method
GameLoop.update()called >10,000 times (default-XX:CompileThreshold=10000) - Backedge count (loop iterations) in
render()exceeds 15,000
β‘οΈ The C1 Compiler (Client, fast compile) kicks in:
- Compiles
update()to optimized native x86-64/ARM64 - Inserts safepoints (polling points for GC/stopping threads)
- Stores result in Code Cache
Later, if update() is still hot β C2 Compiler (Server, slow but ultra-optimized) recompiles it:
- Inlines
Player.move()βVector.add() - Eliminates bounds checks (if proven safe)
- Reorders memory ops
- Uses CPU registers aggressively
Now, future calls to update() jump directly into native code β no interpretation.
π Code Cache fills up?
β If-XX:+ReservedCodeCacheSizeis too small?CodeCache is full. Compiler has been disabled.β οΈ
Performance drops β interpreted again.
ποΈ Phase 7: Garbage Collection β The Silent Guardian
While the game runs, objects pile up in the Eden (young gen):
-
new Particle(),new TemporaryBuffer(), etc.
When Eden fills β Minor GC (Young Collection):
- Stop-The-World (briefly!)
- Mark: Find all live objects (roots: stack frames, statics, JNI refs)
- Copy: Survivors β Survivor Space (S0/S1, from/to toggling)
- Promote: Old enough? β Old Gen (Tenured)
After many cycles β Old Gen fills β Major GC / Mixed GC (G1):
- Concurrent marking phase (runs while app runs!)
- Then Mixed GC: cleans young + some old regions (chosen by βgarbage %β heuristic)
- Compacts memory to avoid fragmentation
π°οΈ Pause times?
- G1 aims for
-XX:MaxGCPauseMillis=200(default)- ZGC/Shenandoah? Sub-millisecond β no stop-the-world! (but newer, not default)
π§© Phase 8: Native Calls β Opening the Door
At some point:
static { System.loadLibrary("sound"); }
native void playExplosion();
β‘οΈ JVM uses JNI:
- Looks for
libsound.so(Linux),sound.dll(Windows) - Resolves
Java_MyGame_playExplosionsymbol - On call:
- Transitions thread to _thread_in_native state
- Jumps to native code (via
call stub) - Native code runs β full OS access!
- On return: checks for pending exceptions, safepoint requests
β οΈ If native code crashes? JVM process dies. No try/catch saves you.
π Phase 9: Shutdown β The Final Frame
When main() returns β or System.exit(0) is called:
- Runs shutdown hooks (
Runtime.addShutdownHook()) - Stops all non-daemon threads
- Flushes I/O buffers
- Unloads classes (if possible β rarely done in practice)
- Frees heap, metaspace, code cache
- JVM process exits β OS reclaims all memory.
The castle dims.
The robot chef bows.
The magic β complete.
π Final Recap Map (For the Kidβs Wall)
[Shell]
β `java MyGame`
[JVM Process Born]
ββ Memory: Heap (Eden/Survivor/Old), Metaspace, Code Cache
ββ Threads: main, GC, Compiler, Service
ββ Subsystems Initialized
[Class Loading Chain]
Bootstrap β Extension β Application β MyGame
[Linking]
Verify β Prepare β Resolve (cascading!)
[Initialization]
<clinit> β static blocks β new objects (Heap!)
[Execution]
Interpreter β (HotSpot) β C1 JIT β C2 JIT
[Memory Management]
TLAB alloc β Minor GC β Promotion β Mixed GC β Compaction
[Native World]
JNI β libsound.so β _thread_in_native β return
[Shutdown]
Hooks β Cleanup β Exit
Ascii Map
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β USER SHELL β
β $ java -Xms512m -Xmx4g -server -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:+PrintGCDetails -XX:+PrintCompilation MyGame β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ¬βββββββββββββββββ
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β JVM PROCESS (HotSpot) β BORN β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Native OS Layer (C/C++) β β
β β β’ libjvm.so (Linux), jvm.dll (Win), libjvm.dylib (macOS) loaded by OS loader β β
β β β’ Threads created at startup: β β
β β - main (JavaThread) β β
β β - VM threads: VMThread (safepoint coordinator), ConcurrentGCThread (G1ConcMark), CompilerThreads (C1, C2), ServiceThread, WatcherThread β β
β β β’ Memory layout initialized: β β
β β - Java Heap: 512 MB reserved (G1: divided into ~2048 regions, ~2 MB each) β β
β β - Metaspace: native memory (non-heap) for Klass*, method metadata, annotations β β
β β - CodeCache: segmented (non-nmethod, profiled nmethod, non-profiled nmethod); stores JIT-compiled native code β β
β β - Thread stacks: 1 MB default (adjustable via -Xss) β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ¬βββββββββββββββββ β
β βΌ |
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Class Loading Subsystem (Delegation Model) | β
β β | β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β Bootstrap ClassLoader (native, no Java object, parent = null) β β Extension ClassLoader (sun.misc.Launcher$ExtClassLoader) β β Application ClassLoader (sun.misc.Launcher$AppClassLoader) β β β
β β β - Implemented in C inside JVM β β - Parent: Bootstrap β β - Parent: Extension β β β
β β β - Loads core platform classes: β β - Loads extensions from jre/lib/ext (or java.ext.dirs) β β - Loads application classes from CLASSPATH (dirs, JARs, ZIPs) β β β
β β β β’ java.lang.Object, String, System, Thread... β β β’ e.g., sun.security.provider, javax.* (legacy) β β β’ MyGame.class, com.mygame.Engine.class, lib/game.jar β β β
β β β - Sources: jrt:/ (JDK 9+ module system), jre/lib/modules β β - Now largely deprecated (replaced by module path) | β β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β
β β Delegation Flow: AppCL β asks ExtensionCL β asks BootstrapCL β if not found, AppCL tries its own URLs (parent-first, but can be bypassed via custom CL) β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββββββββββ β
β βΌ β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Linking & Initialization (JVM Spec Β§5) β β
β β β β
β β 1. Verification (Type 2 β at link time) β β
β β β’ Data-flow analysis verifies: β β
β β - Operand stack consistency (no under/overflow) β β
β β - Type correctness (no putfield on non-ref, no array store exception at runtime) β β
β β - No illegal control flow (e.g., jump into middle of instruction) β β
β β β’ Failure β java.lang.VerifyError β β
β β β β
β β 2. Preparation β β
β β β’ Allocate memory for static fields in InstanceKlass β β
β β β’ Initialize to *default* values: β β
β β int x; β 0, boolean flag; β false, Object ref; β null β β
β β β β
β β 3. Resolution β β
β β β’ Convert symbolic references in Constant Pool to direct references: β β
β β #3 = Class java/lang/System β Klass* for java.lang.System β β
β β #10 = Field System.out:PrintStream β field offset in Klass β β
β β #22 = Method Game.update:()V β Method* + vtable index β β
β β β’ May recursively trigger loading/linking of referenced classes β β
β β β β
β β 4. Initialization (<clinit>) β β
β β β’ Execute static initializers and static blocks *in source order* β β
β β static { score = 100; engine = new GameEngine(); } β β
β β β’ Object creation: β β
β β - TLAB allocation (fast-path, thread-local) in Eden β β
β β - Header: [Mark Word (64b) | Klass Word (32b compressed oop)] β β
β β - Fields zeroed, then constructor (<init>) executed β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ¬βββββββββββββββββ β
β βΌ |
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Runtime Data Areas (JVM Spec Β§2.5) β β
β β β β
β β βββββββββββββββββββββββββββββββββββββββββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β PC Register (per thread) β β Java Stack (per thread) β β Heap (shared, GC-managed) β β β
β β β β’ Holds address of current bytecode β β β’ Grows downward β β β β β
β β β β’ Undefined for native methods β β β’ Frame created on method entry: β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β
β β β β β [Local Variable Table] + [Operand Stack] + [Frame Data (return PC, prev frame ptr)] β β β Young Generation β β β β
β β β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ¬ββββββββββββ β β ββββββββββββββββββββββββββββββββββββββββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β β
β β β β βΌ β β β Eden (object allocation) βββββΆβ Survivor Space (S0 β S1, copying collection) β β β β β
β β β β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β β ββββββββββββββββββββββββββββββββββββββββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β β
β β β β β Method Area (shared, created at JVM start) β β β β β² β β β β
β β β β β β’ Stores per-class structures: β β β βΌ (promotion after ~15 GC cycles) β β β β β
β β β β β - Runtime Constant Pool(per-class symbol tbl)β β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β β
β β β β β - Field/method metadata β β β β Old Generation (Tenured) β β β β β
β β β β β - Static field storage β β β β β’ Region-based (G1): ~2048 regions, 1β32 MB each β β β β β
β β β β β - JIT-compiled code? No β thatβs CodeCache! β β β β β’ Mixed GC: collects Eden + selected Old regions (highest garbage ratio) β β β β β
β β β β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β β
β β β β β | β β β β
β β β β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β
β β β β β Native Method Stacks (per thread) β β β β β
β β β β β β’ Used when thread is in _thread_in_native state β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β β β’ No JVM-enforced limits β OS controls size β β β
β β βββββββββββββββββββββββββββββββββββββββββ ββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
| | | |
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β² |
β β |
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Execution Engine β β
β β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β |
β β β Interpreter β β β
β β β β’ Bytecode interpreter loop: fetch β decode β execute β β β
β β β β’ Template-based (C++ templates emit assembly for each bytecode) β β β
β β β β’ Slow for hot code, but fast startup, low memory β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ¬βββββββββββββ β β
β β β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββ β β
β β β JIT Compiler β HotSpot Adaptive Optimization β β β
β β β β’ Profiling: method invocation counters, backedge counters (loops) β β β
β β β β’ Tiered Compilation (default since JDK 8): β β β
β β β β β β
β β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β
β β β β C1 Compiler (Client) βββββΆ | C2 Compiler (Server) β β β β
β β β β β’ Fast compile (~100β300 ms) β β β’ Slow compile (~1β5 sec), high optimization β β β β
β β β β β’ Enables profiling (e.g., branch counts) β β β’ Inlining (up to 9 levels), escape analysis, lock elision, vectorization (SIMD), loop unrolling β β β β
β β β β β’ Output: profiled nmethods in CodeCache β β β’ Uses Ideal Graph (Sea of Nodes) for global optimization β β β β
β β β β β’ Good for client apps, short-lived processes β β β’ Stored in non-profiled CodeCache segment β β β β
β β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β Garbage Collection (G1 Example) β β β
β β β β’ Concurrent Marking Cycle: β β β
β β β 1. Initial Mark (STW, piggybacks on Young GC) β β β
β β β 2. Concurrent Mark (app threads run) β β β
β β β 3. Remark (STW, finishes marking) β β β
β β β 4. Cleanup (STW, calculates live bytes per region) β β β
β β β β’ Mixed GC Phase: β β β
β β β - After Cleanup, scheduler triggers Mixed GCs β β β
β β β - Each pause collects: Eden + *N* Old regions (selected by garbage % heuristic) β β β
β β β - Goal: meet -XX:MaxGCPauseMillis (e.g., 100 ms) β β β
β β β β’ Humongous Objects (>50% region size) β allocated in Old directly; cleaned in Remark/Cleanup β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β² |
β β |
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ |
β β Java Native Interface (JNI) β |
β β β |
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β Native Method Libraries β β β
β β β β’ Loaded via System.loadLibrary("sound") β dlopen()/LoadLibrary() β finds libsound.so/dll/dylib β β β
β β β β’ Symbol resolution: Java_MyGame_playExplosion β native void JNICALL Java_MyGame_playExplosion(JNIEnv*, jobject) β β β
β β β β’ Call sequence: β β β
β β β 1. Transition thread state: _thread_in_Java β _thread_in_native β β β
β β β 2. Call stub jumps to native code β β β
β β β 3. Native code runs β full OS access, no GC safepoints β β β
β β β 4. On return: check for pending async exceptions, safepoint requests, GC needs β β β
β β β β’ Critical: native code must NOT hold JVM locks across calls; must call JNI functions to access Java objects β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β² |β β |
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Shutdown Sequence (JVM Spec Β§12.8) β β
β β 1. Trigger: main() returns OR System.exit(status) OR fatal error (e.g., OutOfMemoryError: Metaspace) β β
β β 2. Run shutdown hooks (in reverse registration order) β e.g., flush logs, save state β β
β β 3. Run finalizers (if -XX:+ExplicitGCInvokesFinalization; discouraged) β β
β β 4. Stop all non-daemon threads (interrupt + join) β β
β β 5. Close system resources: stdin/stdout, file descriptors, network sockets β β
β β 6. Deallocate: β β
β β - Heap β return to OS (mmap/munmap) β β
β β - Metaspace β free virtual memory ranges β β
β β - CodeCache β purge native code β β
β β - Unload shared classes (if class data sharing used) β β
β β 7. JVM process terminates (exit(status)); OS reclaims full process memory space β | β | | |
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
π Key Legend (Embedded in Diagram)
- STW = Stop-The-World (all app threads paused)
- CP = Constant Pool
- LVs = Local Variables
- OS = Operand Stack
- TLAB = Thread-Local Allocation Buffer (fast-path heap alloc β not shown, but implied in "Heap β Eden")
- G1 Regions = Heap divided into fixed-size regions (default ~1β32 MB); GC selects βgarbage-richβ ones
- HotSpot = Oracleβs JVM implementation (adaptive optimization engine)
Top comments (0)