JIT (Just-In-Time) compiler biên dịch bytecode → mã máy native ngay lúc chạy, thay vì thông dịch từng lệnh. JVM khởi động ở chế độ interpreter (chạy ngay, không cần warm-up) và song song đếm số lần mỗi method/vòng lặp chạy. Khi vượt ngưỡng ("hot"), JIT dịch phần đó ra native rồi tối ưu.
HotSpot dùng tiered compilation 2 tầng:
- C1 (client): dịch nhanh, tối ưu nhẹ → có native sớm.
- C2 (server): tối ưu sâu (inlining, loop unrolling, escape analysis) cho code thật sự nóng.
Vì JIT thấy dữ liệu runtime, nó làm được thứ compiler tĩnh không làm: speculative optimization (giả định một nhánh không bao giờ chạy) và deoptimize khi giả định sai. Đây là lý do Java sau warm-up thường nhanh gần C++.
Hình dung: interpreter dịch từng câu như phiên dịch trực tiếp; JIT là dịch sẵn cả đoạn hay lặp lại thành bản chạy thẳng.