Nội dung
Danh sách bài học
- 01~25 phút
Class loader — load, link, init và parent delegation
Class JVM nạp khi nào, qua tầng nào, và vì sao Tomcat / Spring Boot fat jar có ClassLoader riêng. Hiểu 3 phase load/link/init, hierarchy Bootstrap → Platform → App, parent delegation và 2 lỗi anh em ClassNotFoundException vs NoClassDefFoundError.
- 02~25 phút
Bytecode và javap — đọc instruction JVM
JVM là máy stack-based, không phải register-based như x86. Bytecode là tập opcode 1 byte JVM thực thi. javap dump bytecode để debug compile, hiểu lambda, decompile để verify optimize. 5 invoke* opcode và lý do invokedynamic là cách mạng.
- 03~27 phút
JIT compiler — interpreter, C1, C2, tiered compilation
Bytecode chậm, native code nhanh. JVM bắt đầu bằng interpreter, đo hot method, escalate lên C1 (fast compile), rồi C2 (deep optimize). Inlining, escape analysis, deoptimization. Vì sao Java warm-up vài giây mới đạt peak performance.
- 04~25 phút
Memory layout — heap, metaspace, stack, object header
Đối tượng Java sống ở đâu, header chiếm bao nhiêu byte, vì sao Integer 16 byte mà int 4 byte. Heap young/old generation, metaspace cho class metadata, stack cho frame method, native memory cho buffer ngoài heap. 4 loại OOM khác nhau.
- 05~28 phút
Garbage Collection — G1, ZGC, Parallel và cách chọn
GC làm gì, tại sao Java không cần free thủ công. Generational hypothesis, mark-sweep-compact, copying. 3 collector chính: Parallel (throughput), G1 (default modern), ZGC (low-latency sub-ms). Khi nào chọn cái nào, đọc GC log thế nào.
- 06~28 phút
JVM tools — jstack, jmap, jstat, JFR và async-profiler
Toolkit chẩn đoán production: jps liệt kê process, jstack thread dump deadlock, jmap heap dump leak, jstat metric realtime, jcmd Swiss-army knife, JFR profiling overhead <1%, async-profiler flame graph CPU/alloc. Workflow debug từ symptom đến root cause.
- 07~20 phút
Object Header và Compressed OOP — tại sao mỗi object Java tốn ít nhất 16 byte
Mark word, klass pointer, field layout, padding, và compressed OOP: cơ chế giúp JVM tiết kiệm 30-50% heap. Hiểu 32GB cliff anti-pattern và cách dùng JOL để đo đạc.
- 08~21 phút
Escape Analysis và Scalar Replacement — khi JIT xoá object trước khi bạn tạo nó
Escape analysis phân tích object có thoát khỏi method không. Nếu không, JIT scalar-replace, elide lock, giảm GC pressure về 0 cho object đó. Cơ chế, pitfall, và cách verify.
- 09~20 phút
Safepoint và Stop-The-World — tại sao GC pause dài hơn GC log báo
Safepoint là điểm JVM dừng thread để thực hiện global operation. Cơ chế polling, time-to-safepoint, STW pause, và cách diagnose TTSP spike bằng JFR và safepoint log.
- 10~22 phút
GC Modern Deep — G1, ZGC, Shenandoah: cơ chế, tradeoff và khi nào chọn
Đào sâu 3 GC hiện đại: G1 region-based SATB, ZGC colored pointer và load barrier, Shenandoah Brooks pointer. Write barrier vs read barrier. Khi nào chọn GC nào cho latency và throughput.
- 11~35 phút
Mini-challenge: Debug memory leak với heap dump và JFR
Bài thực hành khép lại Module 12 — đọc app có leak, dùng jstat phát hiện trend, jcmd dump heap, MAT phân tích retained, fix root cause với data structure phù hợp. Workflow production-grade từ symptom đến fix.