JVM là gì?
JVM (Java Virtual Machine) là 1 máy ảo java – nó được dùng để thực thi các chương trình Java hay hiểu nôm na là trình thông dịch của Java. Nó cung cấp môi trường để code java có thể được thực thi. Chương trình Java khi biên dịch sẽ tạo ra các mã máy gọi là bytecodes. Như bạn thấy mỗi hệ điều hành chạy chương trình của nó ứng với một mã máy khác nhau đó là mã bytecodes, ví dụ Windows được biên dịch dưới dạng exe còn Linux là .ELF…
Định nghĩa JVM
Tóm gọn lại là mỗi nền tảng/hệ điều hành khác nhau (Windows, Android, Linux…) lại có một loại JVM khác nhau được cài đặt. Nói Java đa nền tảng, thực chất thì nó được hỗ trợ JVM trên nhiều nền tảng. Chương trình Java chạy được trên Window/Linux/IOS vì nó có JVM chạy được trên các nền tảng đó, vì vậy mới hiểu ý nghĩa là lập trình Java một nơi nhưng chạy được nhiều chỗ là do JVM này thực hiện.
Các bạn có thể tham khảo cơ chế thực hiện 1 chương trình Java trong sơ đồ dưới đây :
Máy ảo java được sinh ra với 3 mục đích chính
- Dịch mã java ra mã máy chạy được trên các hệ điều hành khác nhau
- Tăng tốc độ
- Nâng cao độ bảo mật và tránh virus phá source code
JVM thực hiện các công việc chính sau đây
- Tải code (các class, resource)
- Kiểm tra code (kiểm tra code có đúng cú pháp không, có bị lỗi không, tất nhiên nếu code có lỗi thì sẽ không chạy được chương trình rồi)
- Thực thi code
- Cung cấp môi trường runtime
JVM có 3 thành phần chính
- Class Loader: Tìm kiếm và load các file *.class vào vùng nhớ của java dưới dạng bytecode
- Data Area : vùng nhớ hệ thống cấp phát cho Java Virtual Machine
- Execution Engine: chuyển các lệnh của JVM trong file *.class thành các lệnh của máy, hệ điều hành tương ứng và thực thi chúng.
Cơ chế thực hiện
Sau khi Classloader tìm và load các file .class
, các file này sẽ được máy ảo JVM cung cấp bộ nhớ tương ứng với chúng.
- Class (Method) area: là vùng nhớ cấp phát cho class(Method) trong đó lại phân chia thành
heap
,stack
,PC register
,native method stack
- Heap: Đây là khu vực dữ liệu thời gian chạy trong đó các đối tượng được phân bổ.
- Stack : Các phương thức và tham chiếu tới đối tượng địa phương được lưu trữ trong Stack. Mỗi Thread quản lý một stack. Khi phương thức được gọi, nó được đưa vào đỉnh của Stack. Stack lưu trữ trạng thái của phương thức bao gồm: dòng code thực thi, tham chiếu tới đối tượng địa phương. Khi phương thức chạy xong, vùng nhớ (dòng code thực thi, tham chiếu tới đối tượng địa phương) được đẩy ra khỏi stack và tự động giải phóng.
- PC register (Program Counter Register) : Nó chứa địa chỉ của các máy ảo Java hướng dẫn hiện đang được thực hiện.
- Native Method Stack: Nơi chứa tất cả các method native trong chương trình
- Execution Engine: Nó bao gồm: Một bộ xử lý ảo, một phiên dịch để đọc dòng bytecode sau đó thực hiện các hướng dẫn và cuối cùng là trình biên dịch Just-In-Time (JIT). JIT biên dịch các phần của mã byte có chức năng tương tự như cùng một lúc, và do đó làm giảm số lượng thời gian cần thiết cho compilation.*Thuật ngữ: trình biên dịch là đề cập đến như một dịch giả từ những hướng dẫn của một máy ảo Java (JVM) cho các tập lệnh của CPU cụ thể.
Tài liệu tham khảo thêm: