JVM là gì?
JVM (Java Virtual Machine) là một máy ảo Java – nó được sử dụng để thực thi các chương trình Java hay nói cách khác, là trình thông dịch của Java. JVM cung cấp môi trường để code Java có thể được thực thi. Khi biên dịch, chương trình Java tạo ra mã máy gọi là bytecodes. Ví dụ, 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 file exe, Linux là file .ELF…
Định nghĩa JVM
Mỗi nền tảng hoặc 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 nó được hỗ trợ bởi JVM trên nhiều nền tảng khác nhau. Chương trình Java có thể chạy được trên Windows/Linux/IOS bởi vì nó có JVM chạy được trên các nền tảng đó. Đó là lý do tại sao lập trình Java chỉ cần một nơi nhưng lại có thể chạy được ở nhiều nơi, và JVM này là người thực hiện điều này.
Máy ảo java được sinh ra với 3 mục đích chính
- Dịch mã Java ra mã máy có thể chạy được trên các hệ điều hành khác nhau
- Tăng tốc độ thực thi
- Nâng cao độ bảo mật và tránh vi-rút 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, và nếu code có lỗi, chương trình sẽ không chạy được)
- 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 tương ứng của máy, hệ điều hành 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 đó được 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, nơi 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): Chứa địa chỉ của các hướng dẫn hiện đang được thực hiện trong máy ảo Java.
- Native Method Stack: Nơi chứa tất cả các phương thức native trong chương trình.
- Execution Engine: Bao gồm một bộ xử lý ảo, một trình dịch đọc dòng bytecode và thực hiện các hướng dẫn, 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 đó giảm số lượng thời gian cần thiết cho việc biên dịch. Thuật ngữ này đề cập đến việc dịch từ hướng dẫn của máy ảo Java (JVM) sang các tập lệnh của CPU cụ thể.
Tài liệu tham khảo thêm:
- 4 tính chất của lập trình hướng đối tượng trong Java
- 10 Java Web Framework tốt nhất
- Top 10 câu hỏi phỏng vấn Java thường gặp
- Java và những điều thú vị có thể bạn chưa biết
HEFC được chỉnh sửa bởi HEFC.