Chuyên đề JVM: vùng nhớ, class loading, garbage collection, tuning tham số và troubleshooting production
JVM là nền tảng cốt lõi mà Java backend không thể bỏ qua. Mục tiêu học JVM không phải là ghi nhớ khái niệm, mà là có thể giải thích object được tạo và thu hồi như thế nào, class được load ra sao, GC ảnh hưởng đến ứng dụng thế nào, tham số được cấu hình ra sao, cũng như cách xử lý các vấn đề production như OOM, GC diễn ra thường xuyên và CPU tăng vọt.
Dành cho ai
- Java backend developer muốn học JVM một cách có hệ thống.
- Người đang ôn các câu hỏi phỏng vấn liên quan đến vùng nhớ JVM, class loading, GC, tuning tham số và troubleshooting production.
- Độc giả đã từng tham gia bảo trì service production nhưng chưa quen với GC log, heap dump, thread stack và công cụ JDK.
- Kỹ sư muốn tiếp tục đi sâu vào Spring, Netty, middleware hoặc performance optimization.
Trọng tâm học
- Vùng nhớ runtime của JVM, tạo object, truy cập object và các tình huống OOM.
- Cấu trúc class file, quá trình class loading, class loader và parent delegation model.
- Kiến thức cơ bản về garbage collection, xác định object còn sống, thuật toán garbage collection và các garbage collector phổ biến.
- Tham số JVM, GC log, heap dump, thread stack và các công cụ monitoring, chẩn đoán JDK phổ biến.
- Quy trình cơ bản để xử lý sự cố production: quan sát hiện tượng, thu thập chỉ số, phân tích bằng công cụ, xác định nguyên nhân và kiểm chứng tối ưu hóa.
Thứ tự đọc đề xuất
- Khi chuẩn bị phỏng vấn, hãy đọc trước Tổng hợp câu hỏi phỏng vấn JVM thường gặp để tìm ra những phần bạn chưa trả lời đầy đủ; nếu học có hệ thống, bạn có thể bắt đầu từ bước tiếp theo.
- Giải thích JVM bằng ngôn ngữ dễ hiểu: trước tiên có cái nhìn tổng thể về JVM.
- Giải thích chi tiết vùng nhớ Java (trọng tâm): hiểu runtime data area và các tình huống OOM thường gặp.
- Giải thích chi tiết cấu trúc class file, Giải thích chi tiết quá trình class loading, Giải thích chi tiết class loader (trọng tâm): nắm được quá trình class đi từ
.classđến object có thể chạy được. - Giải thích chi tiết garbage collection của JVM (trọng tâm): học có hệ thống kiến thức cơ bản về GC, thuật toán và garbage collector.
- Tổng hợp các tham số JVM quan trọng nhất, Tổng hợp công cụ monitoring và xử lý sự cố JDK, Xử lý sự cố production của Java backend: bắt đầu với cấu hình tham số và thực tiễn production.
Bài viết cốt lõi
Nền tảng JVM và vùng nhớ
- Tổng hợp câu hỏi phỏng vấn JVM thường gặp: hệ thống hóa các câu hỏi thường gặp theo vùng nhớ, class loading, GC, tham số, công cụ và xử lý sự cố production.
- Giải thích JVM bằng ngôn ngữ dễ hiểu: hiểu vai trò và thành phần của JVM từ góc nhìn tổng thể.
- Giải thích chi tiết vùng nhớ Java (trọng tâm): trình bày program counter, virtual machine stack, native method stack, heap, method area và direct memory.
- Giải thích chi tiết cấu trúc class file: hiểu magic number, version number, constant pool, access flag, field table, method table và attribute table.
Class loading
- Giải thích chi tiết quá trình class loading: hệ thống hóa loading, verification, preparation, resolution, initialization, sử dụng và unloading.
- Giải thích chi tiết class loader (trọng tâm): hiểu bootstrap class loader, extension class loader (JDK 8) / platform class loader (JDK 9+), application class loader và parent delegation model.
Garbage collection và tuning
- Giải thích chi tiết garbage collection của JVM (trọng tâm): hiểu cách xác định object còn sống, các loại reference, thuật toán garbage collection, generational collection và các garbage collector phổ biến.
- Tổng hợp các tham số JVM quan trọng nhất: hệ thống hóa các tham số liên quan đến heap size, GC log, OOM dump, garbage collector và chẩn đoán.
- Tổng hợp công cụ monitoring và xử lý sự cố JDK: giới thiệu các công cụ như jps, jstat, jmap, jstack, jcmd, JConsole, VisualVM, JMC.
- Xử lý sự cố production của Java backend: bắt đầu từ xác nhận cảnh báo, giảm tác động và lưu bằng chứng, rồi lần lượt xử lý CPU, memory, GC, thread pool, connection pool, slow SQL, Redis và message backlog.
Câu hỏi thường gặp
- Vùng nhớ runtime của JVM được phân chia như thế nào? Những vùng nào là thread-private?
- Heap và method area lần lượt lưu trữ gì? Direct memory có thể OOM không?
- Object được tạo như thế nào? Có những cách nào để định vị object khi truy cập?
- Quá trình class loading có những giai đoạn nào? Giai đoạn initialization được kích hoạt khi nào?
- Parent delegation model là gì? Vì sao cần mô hình này?
- Làm thế nào để xác định object có thể được thu hồi? Strong reference, soft reference, weak reference và phantom reference khác nhau thế nào?
- Minor GC, Major GC và Full GC khác nhau thế nào?
- G1, ZGC và Shenandoah lần lượt phù hợp với những trường hợp sử dụng nào?
- Các tham số JVM thường dùng gồm những gì? Làm thế nào để giữ lại GC log và OOM dump trong production?
- Nên xử lý thế nào khi CPU tăng vọt, Full GC xảy ra thường xuyên hoặc có memory leak?
Chuyên đề liên quan
Lời cuối
Nếu nội dung hữu ích với bạn, hãy tiện tay tặng JavaGuide một Star miễn phí để ủng hộ: GitHub | Gitee.
JavaGuide đã được duy trì gần bảy năm, tích lũy 6100+ commit, với sự chung tay hoàn thiện của 620+ contributor. Star, phản hồi và PR của bạn đều là động lực để dự án tiếp tục cập nhật.
Nếu bạn đang chuẩn bị phỏng vấn backend / phát triển ứng dụng AI, có thể tham khảo Knowledge Planet của tôi, bao gồm các project thực tế về backend và AI, tối ưu CV, hỏi đáp 1-1 và tài liệu về các trọng điểm thường gặp, đã được duy trì liên tục sáu năm.
