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.
Ôn lại bytecode
Trong Java, code mà JVM có thể hiểu được gọi là bytecode (tức file có phần mở rộng .class). Bytecode không hướng đến bất kỳ bộ xử lý cụ thể nào mà chỉ hướng đến virtual machine. Thông qua bytecode, ngôn ngữ Java phần nào giải quyết vấn đề hiệu suất thực thi thấp của các ngôn ngữ thông dịch truyền thống, đồng thời vẫn giữ được khả năng di động của ngôn ngữ thông dịch. Vì vậy, chương trình Java có hiệu suất tương đối cao khi chạy. Ngoài ra, do bytecode không nhắm đến một máy cụ thể nên chương trình Java có thể chạy trên máy tính sử dụng nhiều hệ điều hành khác nhau mà không cần biên dịch lại.
Vòng đời của class
Từ khi được load vào memory của virtual machine đến khi được unload khỏi memory, toàn bộ vòng đời của class có thể được khái quát thành 7 giai đoạn: loading, verification, preparation, resolution, initialization, using và unloading. Trong đó, verification, preparation và resolution có thể gọi chung là linking.
Ôn lại quá trình load class
Trước khi giới thiệu Class Loader và Parent Delegation Model, hãy ôn lại ngắn gọn quá trình load class.
- Quá trình load class: load->link->initialize.
- Quá trình link có thể chia thành ba bước: verify->prepare->resolve.
Công cụ dòng lệnh JDK
Các lệnh này nằm trong thư mục bin của thư mục cài đặt JDK:
jps(JVM Process Status): Tương tự lệnhpscủa UNIX. Dùng để xem tên class khởi động, tham số truyền vào, tham số JVM và các thông tin khác của tất cả Java process;jstat(JVM Statistics Monitoring Tool): Dùng để thu thập dữ liệu runtime ở nhiều mặt của HotSpot Virtual Machine;jinfo(Configuration Info for Java): Hiển thị thông tin cấu hình Virtual Machine;jmap(Memory Map for Java): Tạo heap dump snapshot;jhat(JVM Heap Dump Browser): Dùng để phân tích file heapdump, công cụ này tạo một HTTP/HTML server để người dùng xem kết quả phân tích trên trình duyệt. JDK 9 đã loại bỏ jhat;jstack(Stack Trace for Java): Tạo thread snapshot của Virtual Machine tại thời điểm hiện tại. Thread snapshot là tập hợp stack của các method đang được mỗi thread trong Virtual Machine thực thi.
Nếu không có chú thích đặc biệt, nội dung đều nói về HotSpot VM.
Bài viết này được tổng hợp và bổ sung dựa trên cuốn Hiểu sâu JVM: Tính năng nâng cao và thực tiễn tốt nhất của JVM.
Các câu hỏi phỏng vấn thường gặp:
- Làm thế nào xác định một object đã chết (hai cách).
- Giới thiệu ngắn gọn về strong reference, soft reference, weak reference, phantom reference (sự khác nhau giữa phantom reference với soft reference và weak reference, lợi ích của soft reference).
- Làm thế nào xác định một constant là constant không còn sử dụng.
- Làm thế nào xác định một class là class không còn sử dụng.
- Garbage collection có những algorithm nào, đặc điểm của từng algorithm?
- Tại sao HotSpot phải chia thành young generation và old generation?
- Có những garbage collector thường gặp nào?
- Giới thiệu CMS và G1 collector.
- Minor GC và Full GC khác nhau như thế nào?
Khi cảnh báo vừa vang lên, việc điều tra rất dễ bị dẫn dắt bởi đường biểu diễn nổi bật nhất trên trang monitoring. Thấy CPU cao thì lấy thread stack, thấy Full GC thì kiểm tra heap, vừa deploy xong đã chuẩn bị rollback. Nhưng các hiện tượng này thường truyền dẫn lẫn nhau: SQL chậm có thể giữ database connection, việc chờ connection pool lại giữ các business thread, cuối cùng có thể đồng thời thấy latency, error rate và CPU tăng. Chỉ nhìn một chỉ số rất khó xác định root cause.
Phỏng vấn JVM hiếm khi chỉ dừng ở câu hỏi “heap và stack khác nhau thế nào”. Sau khi trả lời về vùng nhớ, interviewer thường hỏi tiếp object được cấp phát thế nào, object nào có thể được thu hồi, vì sao một lần GC lại gây pause, cũng như cách điều tra khi hệ thống production gặp OOM, Full GC thường xuyên hoặc CPU tăng vọt.
Bài viết do Nói lên điều ước của bạn đóng góp, địa chỉ bài gốc: https://juejin.im/post/5e1505d0f265da5d5d744050.
Bài viết này được JavaGuide dịch từ https://www.baeldung.com/jvm-parameters, đồng thời bổ sung và hoàn thiện nhiều nội dung.
Tài liệu về tham số https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.htmlPhiên bản JDK: chủ yếu là 1.8, đồng thời bổ sung các tham số thường dùng ở các phiên bản mới
