JVM là gì? Tìm hiểu chi tiết về Java Virtual Machine trong Java

JVM là gì?

JVM là viết tắt của Java Virtual Machine (Máy ảo Java), là một phần quan trọng của nền tảng Java . Nó là một môi trường thực thi cho các chương trình Java, cho phép chúng được thực thi trên nhiều hệ điều hành khác nhau mà không cần phải biên dịch lại mã nguồn cho từng hệ điều hành riêng lẻ.

Máy ảo Java cũng đảm bảo sự tương thích với các phiên bản Java trước đó, nghĩa là các chương trình Java của phiên bản cũ vẫn có thể chạy trên các phiên bản Java mới hơn mà không cần sửa đổi. Điều này đảm bảo tính ổn định và liên tục của các ứng dụng Java khi có các bản cập nhật mới của JVM và Java.

Nhiệm vụ của JVM là gì?

  • Tải mã bytecode và các tệp lớp của ứng dụng Java.
  • Xác minh tính hợp lệ của mã bytecode và các tệp lớp.
  • Thực thi mã bytecode và các tệp lớp bằng cách sử dụng trình thông dịch hoặc trình biên dịch Just-In-Time (JIT).
  • Cung cấp môi trường thời gian chạy (JRE) cho ứng dụng Java
  • Quản lý bộ nhớ và đối tượng của ứng dụng Java, bao gồm việc cấp phát và thu gom rác.
  • Cung cấp các tiện ích hỗ trợ như quản lý lỗi và ghi nhật ký.
  • Cung cấp các API và thư viện chuẩn để phát triển các ứng dụng Java.
  • Đảm bảo tính bảo mật của ứng dụng Java bằng cách kiểm soát quyền truy cập và cung cấp môi trường thực thi được kiểm soát.
  • Cung cấp khả năng giao tiếp với các thư viện native và các ứng dụng được viết bằng các ngôn ngữ khác như C hoặc C++ thông qua Java Native Interface (JNI).
  • Cung cấp định nghĩa cho các khu vực như khu vực bộ nhớ, định dạng tệp lớp, bộ đăng ký, bộ nhớ heap được thu gom rác và báo cáo lỗi nghiêm trọng.

    Kiến trúc của JVM là gì?

    Kiến trúc JVM (JVM Architecture) bao gồm các thành phần sau:




    Classloader

    Classloader là một hệ thống con của JVM được sử dụng để tải các tệp lớp và các tài nguyên của ứng dụng Java. Khi chúng ta chạy chương trình Java, nó sẽ được tải trước bởi classloader. Có ba classloader được tích hợp sẵn trong Java.

    • Bootstrap ClassLoader: Đây là classloader đầu tiên là siêu lớp của Extension classloader. Nó tải tệp rt.jar chứa tất cả các tệp lớp của Java Standard Edition như các lớp gói java.lang, java.net, java.util, java.io, java.sql v.v.
    • Extension ClassLoader: Đây là classloader con của Bootstrap và là classloader cha của System classloader. Được sử dụng để tải các tệp .jar chứa các lớp mở rộng của Java và các API của bên thứ ba.
    • System/Application ClassLoader: Đây là classloader con của Extension classloader. Nó tải các tệp lớp từ classpath – một biến môi trường hoặc một tùy chọn dòng lệnh cho phép người dùng chỉ định vị trí các tệp lớp được sử dụng trong ứng dụng Java.

    Class (Method) Area

    Class (Method) Area được sử dụng để lưu trữ các metadata của các lớp Java và các phương thức của chương trình.

    Heap

    Đây là nơi lưu trữ các đối tượng Java được cấp phát bởi chương trình. Khi một đối tượng Java được tạo ra, Heap sẽ lưu trữ đối tượng đó. Khi đối tượng không còn được sử dụng nữa, đối tượng sẽ bị xóa khỏi Heap bởi garbage collector và giải phóng không gian bộ nhớ.

    Stack

    Java Stack lưu trữ các frame. Nó giữ các biến cục bộ và kết quả phần (partial results), và đóng vai trò trong việc gọi và trả về phương thức.

    Mỗi luồng (threads) có một JVM stack riêng, được tạo cùng lúc với luồng.

    Một frame mới được tạo mỗi khi một phương thức được gọi. Frame bị hủy khi việc gọi phương thức của nó hoàn thành.

    Program Counter Register

    PC Register chứa địa chỉ của chỉ dẫn đang được thực hiện từ máy ảo Java. Khi chương trình Java được thực thi trên JVM, PC Register sẽ lưu trữ địa chỉ của lệnh tiếp theo mà chương trình sẽ thực thi. Khi lệnh hiện tại được thực thi, giá trị của PC Register sẽ được cập nhật để trỏ tới địa chỉ của lệnh tiếp theo trong chương trình.

    Native Method Stack

    Nó chứa tất cả các phương thức native được sử dụng trong ứng dụng.

    Execution Engine

    Nó bao gồm:

    • Một bộ xử lý ảo (virtual processor)
    • Trình thông dịch: Đọc luồng bytecode sau đó thực thi các hướng dẫn.
    • Trình biên dịch Just-In-Time (JIT): Đượ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ự cùng một lúc, giảm thời gian cần thiết cho biên dịch. Ở đây, thuật ngữ “trình biên dịch” đề cập đến một trình dịch từ bộ chỉ thị của máy ảo Java (JVM) sang bộ chỉ thị của một CPU cụ thể.

    Java Native Interface

    Java Native Interface (JNI) là một framework cung cấp một giao diện (interface) để giao tiếp với một ứng dụng khác được viết bằng một ngôn ngữ khác như C, C ++, Assembly… Java sử dụng khung JNI để gửi đầu ra đến Console hoặc tương tác với thư viện hệ điều hành.

    Cách hoạt động của JVM trong Java

    Java Virtual Machine (JVM) đọc và thực thi mã bytecode được tạo ra từ mã nguồn Java sau khi được biên dịch. Khi chương trình Java được biên dịch, nó sẽ tạo ra một tệp mã bytecode, chứa các mã lệnh được mã hóa dưới dạng byte. JVM sẽ lấy tệp này và dịch nó thành mã máy tính để thực thi trên hệ thống.

    Cách tải JVM là gì?

    Với JVM, bạn sẽ không cài đặt một cách độc lập. Khi bạn tải và cài đặt JRE hoặc JDK thì JVM cũng được tải và cài đặt đồng thời. Việc tải JRE hoặc JDK sẽ phụ thuộc vào nhu cầu của bạn.

    Nếu bạn chỉ muốn chạy các ứng dụng Java mà không phải phát triển hoặc sửa đổi mã nguồn, bạn có thể tải và cài đặt JRE để sử dụng JVM.

    Nếu bạn muốn phát triển các ứng dụng Java hoặc sử dụng các công cụ phát triển như trình biên dịch và trình gỡ lỗi, bạn cần tải và cài đặt JDK.




thẻ:
JVM