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

0
1964
Tìm hiểu chi tiết bên trong JVM

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 hiện 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 JVM
Kiế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à các classloader bên trong do Java cung cấp. Nếu bạn muốn tạo classloader của riêng mình, bạn cần mở rộng lớp ClassLoader.

2. Class (method) Area

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

3. Heap

Đây là vùng runtime data trong đó các đối tượng được phân bổ.

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 thức được gọi. Một frame bị hủy khi việc gọi phương thức của nó hoàn thành.

5. Program Counter Register

PC (bộ đếm chương trình) đăng 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ất cả các phương thức 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 cung cấp giao diện để giao tiếp với một ứng dụng khác được viết bằng ngôn ngữ 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 các thư viện hệ điều hành.

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.