Bytecode & .class Files
The structure of Java .class files — constant pool, bytecode instructions, and using javap to disassemble compiled code — plus how generics erasure, lambdas, and string concatenation look at the bytecode level.
The structure of Java .class files — constant pool, bytecode instructions, and using javap to disassemble compiled code — plus how generics erasure, lambdas, and string concatenation look at the bytecode level.
How the JVM loads, links, and initializes classes on demand — the parent-delegation model, the three standard classloaders, and how frameworks use custom classloaders for isolation and hot reload.
How the JVM automatically reclaims heap memory — GC roots, reachability analysis, generational collection, and the major collectors (Serial, Parallel, G1, ZGC) with tuning flags.
How the JVM's Just-In-Time compiler converts hot bytecode into native machine code at runtime — tiered compilation (C1/C2), inlining, escape analysis, and the warmup behavior you see in every production service.
Class loading, memory management, garbage collection, JIT compilation.
The JVM's runtime memory layout — heap regions, stack frames, Metaspace, and per-thread vs. shared areas — and why understanding it matters for diagnosing OutOfMemoryErrors and tuning performance.
The root of every Java class hierarchy — toString, equals, hashCode, clone, wait, notify, and finalize explained with contracts and pitfalls.
How the Java compiler removes all generic type information before producing bytecode, why this design choice was made for backward compatibility, and what limitations it imposes at runtime.