Lab 01: JVM Internals
Overview
Step 1: The ClassLoader Hierarchy
Bootstrap ClassLoader (loads rt.jar / java.* — null in Java)
│
Platform ClassLoader (formerly Extension ClassLoader — loads javax.*)
│
Application ClassLoader (loads -classpath, user code)
│
Custom ClassLoaders (plugins, OSGi, dynamic bytecode)public class ClassLoaderHierarchy {
public static void main(String[] args) throws Exception {
ClassLoader app = ClassLoaderHierarchy.class.getClassLoader();
ClassLoader platform = app.getParent();
ClassLoader bootstrap = platform.getParent(); // null — native Bootstrap
System.out.println("App ClassLoader: " + app);
System.out.println("Platform ClassLoader: " + platform);
System.out.println("Bootstrap ClassLoader:" + bootstrap); // null
// Delegation: String is loaded by Bootstrap
Class<?> strClass = app.loadClass("java.lang.String");
System.out.println("String loaded by: " + strClass.getClassLoader()); // null
}
}Step 2: Custom ClassLoader with defineClass
Step 3: Generating Bytecode with ASM
Step 4: Inspecting Bytecode with javap
Step 5: JVM Diagnostic Flags
Step 6: ClassLoader Isolation in Practice
Step 7: Runtime Class Generation and Loading
Step 8: Capstone — Custom ClassLoader with Delegation
Summary
Concept
Key Class/API
Use Case
Last updated
