Tìm hiểu chi tiết bên trong JVM | JAVA DEV

JVM (Java Virtual Machine) là một máy ảo. Nó cung cấp môi trường runtime, nơi mà mã Java bytecode sẽ được thực thi.

JVMs có sẵn các phiên bản cho nhiều nền tảng (JVM phụ thuộc vào nền tảng)

JVM là gì?

  • Một đặc tả: Chỉ định nơi làm việc của máy ảo Java. Việc triển khai của nó đã được cung cấp bởi Oracle và các công ty khác.
  • Một Khai triển của nó được gọi là JRE (Java Runtime Environment).
  • Runtime Instance: Bất cứ khi nào bạn viết lệnh java trên command prompt để chạy java class, một phiên bản của JVM sẽ được tạo.

JVM làm gì?

JVM thực thi thao tác sau :

  • Load code
  • Xác thực code
  • Thực thi code
  • Cung cấp Runtime Environment

JVM cung cấp định nghĩa cho:

  • Vùng nhớ
  • Định dạng file class
  • Thiết lập đăng ký
  • Thu gom rác
  • Báo cáo lỗi

Kiến trúc của JVM

Hãy nhìn vào hình bên dưới để hiểu kiến ​​trúc bên trong của JVM. Nó chứa classloader, vùng nhớ, công cụ thực thi, v.v.

Kiến trúc của JVMKiến trúc của JVM

1. Classloader

Classloader là một hệ thống con của JVM, được sử dụng để load các tệp class. Bất cứ khi nào 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 trong Java.

Bootstrap classloader: Đây là classloader đầu tiên là super class của Extension classloader. Nó tải tệp rt.jar chứa tất cả các tệp class của Java Standard Edition như các package classes java.lang, các package classes java.net, các package classes java.util, các package classes java.io, các package classes java.sql, v.v.

Extension classloader: Đây là trình nạp class con của Bootstrap và trình nạp lớp cha của System. Nó tải các tệp jar nằm trong thư mục $JAVA_HOME/jre/lib/ext.

System / Application classloader: Đây là trình nạp lớp con của Extension classloader. Nó tải các classfiles từ classpath. Theo mặc định, classpath được đặt thành thư mục hiện tại. Bạn có thể thay đổi đường dẫn lớp bằng cách sử dụng chuyển đổi ‘-cp‘ hoặc ‘-classpath‘. Nó còn được gọi là trình nạp lớp ứng dụng.

//Ví dụ in ra khi Classloader được gọi 
public class ClassLoaderExample  
{  
    public static void main(String[] args)  
    {  
        // Hãy in ra Classloader của class hiện tại.   
        //Application/System classloader sẽ tải class này  
        Class c=ClassLoaderExample.class;  
        System.out.println(c.getClassLoader());  
        //Nếu chúng ta in classloader name của String, nó sẽ in null vì nó là một
        //Lớp dựng sẵn được tìm thấy trong rt.jar, do đó, nó được tải bởi Bootstrap classloader
        System.out.println(String.class.getClassLoader());  
    }  
}

Kết quả nhận được là :

sun.misc.Launcher$AppClassLoader@4e0e2f2a
null

Đây là những classloader bên trong do Java cung ứng. Nếu bạn muốn tạo classloader của riêng mình, bạn cần lan rộng ra lớp ClassLoader .

2. Class (method) Area

Khu vực Lớp ( Phương thức ) tàng trữ những cấu trúc trên mỗi lớp như nhóm hằng số runtime, tài liệu trường và phương pháp, mã cho những phương pháp .

3. Heap

Đây là vùng runtime data trong đó những đối tượng người tiêu dùng được phân chia .

4. Stack

Java Stack lưu trữ các frames. Nó chứa các biến cục bộ và một phần kết quả, và đóng một phần trong việc gọi và trả về phương thức.

Mỗi luồng có một ngăn xếp JVM 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 pháp được gọi. Một frame bị hủy khi việc gọi phương pháp của nó hoàn thành xong .

5. Program Counter Register

PC ( bộ đếm chương trình ) ĐK chứa địa chỉ lệnh của máy ảo Java hiện đang được thực thi .

6. Native Method Stack

Nó chứa tổng thể những phương pháp riêng được sử dụng trong ứng dụng .

7. Execution Engine

Nó chứa :

A virtual processor

Intepreter: Đọc luồng bytecode sau đó thực hiện các hướng dẫn.

Just-In-Time Compiler: Nó đượ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 và do đó làm giảm lượng thời gian cần thiết để biên dịch. Ở đây, thuật ngữ ‘Compiler’ dùng để chỉ một trình dịch từ tập lệnh của máy ảo Java (JVM) sang tập lệnh của một CPU cụ thể.

8. Java Native Interface

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

Tổng kết

JVM (Java Virtual Machine) là một máy ảo của Java. Cơ chế hoạt động bên trong như bên trên bạn thấy, khá phức tạp. Nhưng bạn không cần thiết phải hiểu rõ chúng. Chỉ cần hiểu JVM thực sự cần thiết để có thể chạy bất kỳ mã Java nào trên bất kỳ hệ điều hành nào là được.