Learning Outcome & Exercises: JVM
Tổng kết chương JVM: học xong mình phải làm được gì, và làm bài tập nào để chứng minh?
Đọc hiểu chưa đủ để đi phỏng vấn. Mỗi chương kết thúc bằng những việc làm được và chứng minh được: có code chạy, có test cho cả trường hợp lỗi, có log hoặc số đo. Bài tập nằm trong repo riêng java-backend-interview-labs, thư mục labs/jvm.
1. Mục tiêu đầu ra
Học xong chương này, bạn tự làm được:
- Bật GC log, đọc được pause time và tần suất GC của một ứng dụng Spring Boot.
- Tái hiện một memory leak, lấy heap dump và chỉ ra đường giữ object (GC root).
- Lấy thread dump khi ứng dụng treo và nhận diện deadlock hoặc thread pool cạn.
2. Basic: Đọc GC log
Trạng thái: ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành
Chạy app với -Xlog:gc*:file=gc.log và tải giả, trích 3 dòng GC log và giải thích young/old, pause.
Bài liên quan: Garbage Collection, Stack vs Heap
Hoàn thành khi:
- gc.log trong evidence/
- README chú thích từng trường
3. Intermediate: Memory leak → heap dump
Trạng thái: ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành
Tạo leak qua static Map không bao giờ xoá, chạy tới OOM với -XX:+HeapDumpOnOutOfMemoryError, phân tích dominator tree.
Bài liên quan: Memory leak & OutOfMemoryError, Chẩn đoán production: heap dump, thread dump, JFR
Hoàn thành khi:
- Ảnh/ghi chú dominator tree
- Bản sửa và test chứng minh heap ổn định
4. Challenge: JFR khi production chậm
Trạng thái: ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành
Ghi JFR 60 giây khi bắn tải, tìm method nóng nhất và lock contention; so sánh trước/sau tối ưu.
Bài liên quan: Chẩn đoán production: heap dump, thread dump, JFR, Java chạy thế nào: bytecode, JIT
Hoàn thành khi:
- File .jfr hoặc tóm tắt số liệu
- Giải thích trade-off của bản tối ưu
5. Tiêu chí hoàn thành chung
- Tự giải thích được bài toán và vì sao chọn giải pháp.
- Code chạy được bằng lệnh ghi trong README, không chứa secret.
- Có test tự động cho happy path và failure path.
- Có log hoặc số đo trong
evidence/chứng minh kết quả. - Có câu trả lời phỏng vấn ngắn bằng tiếng Việt và tiếng Anh.
- README của lab có link ngược về bài học tương ứng.
6. Lab và trạng thái
| Mức | Bài tập | Trạng thái | Test / bằng chứng |
|---|---|---|---|
| Basic | Đọc GC log | ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành | — |
| Intermediate | Memory leak → heap dump | ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành | — |
| Challenge | JFR khi production chậm | ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành | — |
Repo lab: java-backend-interview-labs/labs/jvm. TODO: link GitHub là placeholder cho tới khi repo được push.
evidence/; chỉ đánh dấu xong khi có bằng chứng.Phỏng vấn hỏi về JVM, câu nào hay gặp nhất và trả lời sao?
Q1. Ứng dụng bị OutOfMemoryError trên production, bạn làm gì?
🇻🇳 Tiếng Việt:
Giữ bằng chứng trước: heap dump tự động khi OOM, GC log và metric heap. Sau đó phân tích dominator tree để tìm object chiếm bộ nhớ và đường giữ nó, rồi mới quyết định sửa code hay tăng heap.
🇬🇧 English:
Keep the evidence first: an automatic heap dump on OOM, GC logs and heap metrics. Then analyze the dominator tree to find what holds the memory and why, and only then decide whether to fix code or resize the heap.
Cách nhớ ngắn gọn
- Mỗi bài tập = code + test + log.
- Luôn có ít nhất một failure case.
- Chưa có bằng chứng thì chưa xong.
Tự kiểm tra
Bài tập Basic (Đọc GC log) được coi là xong khi nào?
gc.log trong evidence/; README chú thích từng trường. Chưa có code chạy và bằng chứng thì chưa tính là xong.
Bài tập Intermediate (Memory leak → heap dump) được coi là xong khi nào?
Ảnh/ghi chú dominator tree; Bản sửa và test chứng minh heap ổn định. Chưa có code chạy và bằng chứng thì chưa tính là xong.
Bài tập Challenge (JFR khi production chậm) được coi là xong khi nào?
File .jfr hoặc tóm tắt số liệu; Giải thích trade-off của bản tối ưu. Chưa có code chạy và bằng chứng thì chưa tính là xong.