Java Virtual Machine
Bạn là một lập trình viên Java hoặc một người mới đam mê theo đuổi Java bởi vì slogan nổi tiếng của nó “Write once, run anywhere”. Nhưng có bao giờ bạn thắc mắc rằng - điều kỳ diệu gì đã giúp Java làm nên được điều khác biệt đó chưa?
Không chần chờ gì nữa, chúng ta hãy cùng nhau tìm hiểu về một thành phần quan trọng làm nên sự kỳ diệu đó – JVM.
1. Java Virtual Machine là gì?
Máy ảo Java, tiếng Anh là Java virtual machine (viết tắt: JVM) là một máy ảo cho phép chạy các chương trình Java cũng như các chương trình được vi ết bằng các ngôn ngữ khác được biên dịch sang mã bytecode.
JVM có hai chức năng chính: cho phép các chương trình Java chạy trên mọi thiết bị hoặc hệ điều hành (được gọi là nguyên tắc “Viết một lần, chạy mọi nơi”) và để quản lý - tối ưu hóa bộ nhớ chương trình.
Khi Java được phát hành vào năm 1995, tất cả các chương trình máy tính được ghi vào một hệ điều hành cụ thể và bộ nhớ chương trình được quản lý bởi nhà phát triển phần mềm. Kể từ đó, JVM như là một phát kiến mới trong lịch sử ngành phần mềm.
JVM cũng có thể định nghĩa theo hai cách mà các lập trình viên hay nghĩ về nó hằng ngày:
-
Định nghĩa kỹ thuật: JVM là đặc tả cho một chương trình phần mềm để thực thi mã và cung cấp môi trường thời gian chạy cho mã đó.
-
Định nghĩa hàng ngày: JVM là cách chúng ta chạy các chương trình Java. Chúng ta cấu hình các cài đặt của JVM và sau đó dựa vào nó để quản lý tài nguyên chương trình trong khi thực thi.
Khi các lập trình viên nói về JVM, chúng ta thường nghĩ là quá trình đang chạy trên một máy, đặc biệt là máy chủ để kiểm soát việc sử dụng tài nguyên cho ứng dụng Java. Điều này tương phản với đặc tả của JVM – cái được mô tả để xây dựng một chương trình cho việc thực hiện các tác vụ.
2. Java Virtual Machine hoạt động thế nào?
JVM bản chất cũng như một chương trình lớn. Muốn biết nó hoạt động như thế nào trước tiên chúng ta hãy cùng tìm hiểu xem kiến trúc của một JVM ra sao cái đã.
Kiến trúc của một JVM bao gồm 3 phần chính: trình nạp lớp, vùng nhớ và công cụ thực thi được mô tả như hình bên dưới:
Trong đó:
- Classloader là một hệ thống phụ của JVM được sử dụng để tải các file class.
- Class (Method) Area: vùng chứa các class và cung cấp các class nền tảng cho phép mở rộng hoặc ghi đè lên nó.
- 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: lưu trữ các biến cục bộ và kết quả từng phần, và đóng một phần trong phương pháp gọi và trả về. Mỗi luồng cung cấp 1 JVM stack riêng, được tạo cùng thời gian với luồng. Một new-frame được tạo ra mỗi lần phương thức được gọi. Một frame bị hủy khi phương thức được gọi của nó hoàn thành.
- Program Counter Register: PC (đếm chương trình) đăng ký. 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: chứa tất cả các phương thức gốc được sử dụng trong các ứng dụng.
- Execution Engine bao gồm:
- Một bộ xử lý ảo
- Phiên dịch: Đọc bytecode và thực hiện.
-
Just-In-Time (JIT) biên dịch: được sử dụng để cải thiện hiệu suất. JIT biên dịch các phần của bytecode có chức năng tương tự, do đó làm giảm số lượng thời gian cần thiết cho việc compilation.Thuật ngữ: trình biên dịch: đề 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ể.
- The Native Method: cho phép mã Java đang chạy trong JVM để gọi bởi các thư viện và ứng dụng gốc.
- Native Libraries: tập hợp các thư viện cần thiết cho công cụ thực thi.
Với kiến trúc được mô tả và đánh số như trong hình, chúng ta không khó để có thể hiểu được cơ chế hoạt động của một JVM. Cụ thể, JVM hoạt động với 4 công việc chính:
- Loads code - tải mã lệnh: tìm kiếm và thực hiện nhiệm vụ tải cácc file
*.jarvà các class nằm trong thư mụcjre/libđể đưa vào vùng nhớ. - Verifies code - Kiểm tra mã lệnh: kiểm tra các
bytecodevừa được tạo ra có phù hợp hay không. Nếu không sẽ báo lỗi. Tất cả các biếnstaticđược cấp phát bộ nhớ và gán cho giá trị mặc định và tất cả tham chiếu bộ nhớ dạng ký hiệu (symbol memory reference) được thay thế bằng tham chiếu dạng nguyên thủy (original reference). - Executes code - thực thi mã lệnh: đọc và thi từng đoạn bytecode đã được gán qua Runtime Data Area. Chuyển mã dạng byt`ecode sang ngôn ngữ máy tương ứng với hệ điều hành đang sử dụng.
- Provides runtime environment - công cấp môi trường biên dịch mã: cung cấp
InterpretervàJIT Compiler - Just In Time Compilerđể hỗ trợ cho việc thực thi mã lệnh (Executes code).
3. Ưu điểm của Java Virtual Machine
Như đã nói JVM như một phát kiến trong ngành phần mềm, nó được ra đời và tồn tại đến ngày hôm nay cũng nhờ vào những ưu điểm nổi bật vốn có của mình
Mã nguồn mở: đây là điều kiện thuận lợi để các lập trình viên trên thế giới đều có thể đóng góp, hoặc chỉnh sửa – khắc phục lỗi để JVM ngày một tốt hơn.
Nền tảng độc lập: bytecode có thể được viết một lần và sau đó chạy trên nhiều nền tảng. Bytecodea không cần phải được chuyển đến một môi trường phần cứng cụ thể vì nó chạy trong JVM. Bất kỳ ứng dụng nào được biên dịch thành bytecode đều có thể chạy trên bất kỳ nền tảng điện toán nào có JVM.
Bảo mật: máy ảo Java có các tính năng bảo mật tích hợp cho phép các lập trình viên viết các chương trình Java có độ bảo mật cao. Nó cũng ngăn phần mềm độc hại xâm phạm Hệ điều hành vì nó ngăn các ứng dụng Java tương tác với tài nguyên của Hệ điều hành.
Tối ưu hóa phần cứng: Người dùng có thể gửi các tùy chọn cụ thể cho trình biên dịch liên quan đến các chi tiết của phần cứng mà chương trình sẽ chạy. Điều này cho phép trình biên dịch tạo mã máy giúp sử dụng hiệu quả nhất phần cứng được chỉ định.
Hơn hai thập kỷ qua JVM đã và đang làm tốt sứ mệnh của mình, luôn được các lập trình viên yêu thích và đóng góp tích cực để ngày càng hoàn thiện và tối ưu hoá. JVM là một kiến thức quan trọng không thể thiếu đối với lập trình viên, nhất là Java.
Hiểu biết sâu về JVM có thể giúp bạn lường trước hoặc khắc phục các rũi ro về bảo mật và ngăn chặn việc rò rỉ mã nguồn, đảm bảo quyền sở hữu cho chất xám của chính mình.
Bài viết mang tính chất “ghi chú, lưu trữ, chia sẻ và phi lợi nhuận”.
Nếu bạn thấy hữu ích, đừng quên chia sẻ với bạn bè và đồng nghiệp của mình nhé!
Happy coding! 😎 👍🏻 🚀 🔥