JVM là gì? Giải thích về JVM. Archikiến trúc

⚡ Tóm tắt thông minh

Java Máy ảo Java (JVM) là công cụ cung cấp môi trường thời gian chạy để vận hành. Java Mã này chuyển đổi mã bytecode độc ​​lập với nền tảng thành ngôn ngữ máy gốc. Nó là một phần của... Java Môi trường thời gian chạy và cho phép JavaTính năng ghi một lần, chạy ở mọi nơi của nó.

  • 🧩 Cầu nối mã byte: Java Trình biên dịch tạo ra mã bytecode thay vì mã máy, và JVM sẽ diễn giải mã bytecode đó trên bất kỳ hệ thống máy chủ nào.
  • 🏗️ Trung tâm Archikiến trúc: JVM kết hợp ClassLoader, vùng phương thức, vùng nhớ heap, ngăn xếp, thanh ghi PC và công cụ thực thi để chạy các chương trình.
  • 🔄 Quy trình biên dịch: Không giống như C, Java Không cần liên kết; các tệp lớp được tải vào RAM, được xác minh và sau đó được thực thi trong thời gian chạy.
  • Trình biên dịch JIT: Trình biên dịch Just-In-Time chuyển đổi mã bytecode thành mã máy gốc trong quá trình thực thi để cải thiện hiệu suất.
  • 🐢 Lưu ý về hiệu suất: Việc liên kết động và diễn giải thời gian chạy trong lịch sử đã tạo nên Java Tuy nhiên, các phiên bản hiện đại phần lớn đã thu hẹp khoảng cách đó, khiến tốc độ chậm hơn.

JVM Archikiến trúc

JVM là gì trong Java?

Java Máy ảo (JVM) là một công cụ cung cấp môi trường thời gian chạy để điều khiển Java mã hoặc ứng dụng. Nó chuyển đổi Java mã byte sang ngôn ngữ máy. JVM là một phần của Java Môi trường thực thi (JRE). Trong các ngôn ngữ lập trình khác, trình biên dịch tạo ra mã máy cho một hệ thống cụ thể. Tuy nhiên, Java Trình biên dịch tạo ra mã cho một Máy ảo được gọi là Java Máy ảo.

JVM hoạt động như thế nào?

Đầu tiên, Java Mã được biên dịch thành mã byte. Mã byte này được thông dịch trên các máy khác nhau. Giữa hệ thống máy chủ và... Java Mã nguồn, bytecode là ngôn ngữ trung gian. JVM trong Java chịu trách nhiệm phân bổ không gian bộ nhớ.

Làm việc của Java Máy ảo JVM

Làm việc của Java Máy ảo (JVM)

Archikiến trúc của JVM (Java Máy ảo)

Bây giờ, chúng ta hãy cùng tìm hiểu kiến ​​trúc của JVM. Kiến trúc JVM trong Java Bao gồm trình nạp lớp, vùng nhớ, công cụ thực thi, và nhiều hơn nữa.

JVM Archikiến trúc

Java Máy ảo Archikiến trúc

1) Trình nạp lớp
Trình tải lớp là một hệ thống con được sử dụng để tải các tệp lớp. Nó thực hiện ba chức năng chính, đó là Tải, Liên kết và Khởi tạo.

2) Khu vực phương pháp
Vùng phương thức JVM lưu trữ các cấu trúc lớp như siêu dữ liệu, nhóm hằng số thời gian chạy và mã cho các phương thức.

3) Đống
Tất cả các Đối tượng, các biến thể hiện liên quan của chúng và các mảng được lưu trữ trong heap. Bộ nhớ này là chung và được chia sẻ trên nhiều luồng.

4) Ngăn xếp ngôn ngữ JVM
Java Các ngăn xếp ngôn ngữ lưu trữ các biến cục bộ và kết quả một phần của chúng. Mỗi luồng có ngăn xếp JVM riêng, được tạo đồng thời khi luồng được tạo. Một khung mới được tạo ra mỗi khi một phương thức được gọi và nó bị xóa khi quá trình gọi phương thức hoàn tất.

5) Thanh ghi PC
Thanh ghi PC lưu trữ địa chỉ của Java Lệnh máy ảo hiện đang được thực thi. Trong JavaMỗi luồng có thanh ghi PC riêng biệt.

6) Ngăn xếp phương thức gốc
Ngăn xếp phương thức gốc chứa các lệnh của mã gốc phụ thuộc vào thư viện gốc. Nó được viết bằng một ngôn ngữ khác thay vì ngôn ngữ gốc. Java.

7) Công cụ thực thi
Bộ xử lý thực thi đọc mã bytecode và thực thi từng phần. Nó sử dụng trình thông dịch và trình biên dịch Just-In-Time (JIT) để chuyển đổi mã bytecode thành mã máy gốc và chạy nó.

8) Giao diện phương thức gốc
Giao diện phương thức gốc là một khung lập trình. Nó cho phép Java Mã nguồn chạy trong JVM để gọi và được gọi bởi các ứng dụng và thư viện gốc.

9) Thư viện phương thức gốc
Native Libraries là một bộ sưu tập các thư viện bản địa (C, C++) mà Công cụ thực thi cần thiết.

Phần mềm Code Quá trình biên dịch và thực thi

Để viết và thực thi một chương trình phần mềm, bạn cần những điều sau:

  • 1) Biên tập viên – Để nhập chương trình của bạn vào, bạn có thể sử dụng Notepad.
  • 2) Trình biên dịch – Chuyển đổi chương trình ngôn ngữ cấp cao của bạn thành mã máy gốc.
  • 3) Trình liên kết – Để kết hợp các tham chiếu tệp chương trình khác nhau trong chương trình chính của bạn lại với nhau.
  • 4) Trình tải – Để tải các tệp từ thiết bị lưu trữ phụ của bạn như ổ cứng, ổ flash hoặc đĩa CD vào RAM để thực thi. Quá trình tải được thực hiện tự động khi bạn chạy mã.
  • 5) Thi hành – Việc thực thi mã lệnh thực tế, được điều khiển bởi hệ điều hành và bộ xử lý của bạn.

Với kiến ​​thức nền tảng này, hãy xem video sau đây để tìm hiểu về hoạt động bên trong và kiến ​​trúc của JVM (Java Máy ảo).

Nhấp chuột đây nếu video không thể truy cập được

Quá trình biên dịch và thực thi mã C

Để hiểu Java Trước tiên, chúng ta hãy cùng xem qua quá trình biên dịch và liên kết trong ngôn ngữ C.

Giả sử trong hàm chính bạn đã gọi hai hàm, f1 và f2. Hàm chính được lưu trữ trong tệp a1.c.

Mã C của hàm chính a1.c

Hàm f1 được lưu trữ trong tệp a2.c.

Hàm C f1 a2.c

Hàm f2 được lưu trữ trong tệp a3.c.

Hàm C f2 a3.c

Tất cả các tập tin này, tức là a1.c, a2.c và a3.c, được đưa vào trình biên dịch, đầu ra của trình biên dịch là các tập tin đối tượng tương ứng, chính là mã máy.

Trình biên dịch mã C tạo ra các tệp đối tượng.

Bước tiếp theo là tích hợp tất cả các tệp đối tượng này vào một tệp .exe duy nhất với sự trợ giúp của trình liên kết. Trình liên kết sẽ kết hợp tất cả các tệp này lại với nhau và tạo ra tệp .exe.

Trình liên kết mã C tạo ra tệp thực thi (exe).

Trong quá trình chạy chương trình, một chương trình tải sẽ tải tệp .exe vào... RAM để thi hành.

Trình tải mã C tải tệp thực thi (exe) vào RAM.

Java Biên dịch và thực thi mã trong Java VM

Bây giờ, chúng ta hãy xem xét quy trình để JavaTrong chương trình chính của bạn, có hai phương thức, f1 và f2.

  • Phương thức chính được lưu trữ trong tệp a1.java.
  • f1 được lưu trữ trong một tệp dưới dạng a2.java
  • f2 được lưu trữ trong một tệp dưới dạng a3.java

Java Mã này biên dịch ba tập tin thành các tập tin lớp.

Trình biên dịch sẽ biên dịch ba tệp và tạo ra ba tệp .class tương ứng, bao gồm mã BYTE. Khác với C, không có quá trình liên kết nào được thực hiện.

Java VM, vàng Java Máy ảo nằm trên bộ nhớ RAM. Trong quá trình thực thi, sử dụng trình tải lớp, các tập tin lớp được đưa vào RAM. Mã BYTE được kiểm tra để phát hiện bất kỳ lỗ hổng bảo mật nào.

Java Trình tải lớp đưa các tập tin lớp vào RAM.

Tiếp theo, công cụ thực thi sẽ chuyển đổi mã bytecode thành mã máy gốc. Đây là quá trình biên dịch tức thời (just-in-time compiling). Đây là một trong những lý do chính tại sao... Java là tương đối chậm.

Java Công cụ thực thi chuyển đổi mã bytecode thành mã gốc.

LƯU Ý: JIT, hay trình biên dịch Just-in-time, là một phần của... Java Máy ảo Java (JVM). Nó diễn giải các phần của mã byte có chức năng tương tự nhau cùng một lúc.

Tại sao lại là Java cả ngôn ngữ được giải thích và biên dịch?

Ngôn ngữ lập trình được phân loại là:

  • Ngôn ngữ cấp cao hơn, ví dụ: C++, Java
  • Các ngôn ngữ lập trình trình độ trung cấp, ví dụ như C.
  • Ngôn ngữ cấp thấp, ví dụ: Assembly
  • Cuối cùng, cấp độ thấp nhất là Ngôn ngữ máy.

A trình biên dịch là một chương trình chuyển đổi chương trình từ cấp độ ngôn ngữ này sang cấp độ ngôn ngữ khác. Ví dụ, việc chuyển đổi một chương trình từ một cấp độ ngôn ngữ này sang cấp độ ngôn ngữ khác. C++ chương trình thành mã máy. Java trình biên dịch chuyển đổi cấp cao Java mã thành bytecode (cũng là một loại mã máy).

An thông dịch viên là một chương trình chuyển đổi một chương trình ở cấp độ này sang một ngôn ngữ lập trình khác ở cấp độ khác. cùng đẳng cấpVí dụ, sự chuyển đổi của một Java chương trình vào C++.

In JavaBộ tạo mã Just-In-Time chuyển đổi mã bytecode thành mã máy gốc, ở cùng cấp độ lập trình. Do đó, Java Nó vừa là ngôn ngữ biên dịch, vừa là ngôn ngữ thông dịch.

Tại sao lại là Java chậm?

Hai lý do chính đằng sau sự chậm chạp của Java là:

  1. Liên kết động: Không giống như C, việc liên kết được thực hiện trong thời gian chạy, mỗi khi chương trình được chạy Java.
  2. Trình thông dịch thời gian chạy: Việc chuyển đổi mã byte thành mã máy gốc được thực hiện trong thời gian chạy JavaĐiều này càng làm chậm tốc độ hơn nữa.

Tuy nhiên, các phiên bản mới nhất của Java đã giải quyết được phần lớn những điểm nghẽn về hiệu năng này.

Câu Hỏi Thường Gặp

JVM chạy các framework về trí tuệ nhân tạo và dữ liệu lớn như Deeplearning4j, Weka và Apache. SparkTrình biên dịch Just-In-Time và khả năng quản lý bộ nhớ cho phép các thư viện này xử lý hiệu quả các tập dữ liệu lớn trên nhiều nền tảng mà không cần viết lại mã gốc.

Đúng vậy. Các công cụ phân tích hiệu năng hỗ trợ bởi AI có thể phân tích nhật ký thu gom rác, đề xuất kích thước vùng nhớ heap và gắn cờ các phương thức chậm. Chúng giúp tinh chỉnh các cờ JVM và phát hiện các điểm nghẽn nhanh hơn, mặc dù nhà phát triển vẫn nên xác thực mọi thay đổi được đề xuất.

JVM chạy mã bytecode. JRE đóng gói JVM cùng với các thư viện cốt lõi cần thiết để chạy. Java Các chương trình. JDK bổ sung các công cụ phát triển như trình biên dịch và trình gỡ lỗi, vì vậy nó được sử dụng để xây dựng các ứng dụng.

Mã bytecode không phụ thuộc vào nền tảng, nhưng bản thân JVM lại phụ thuộc vào nền tảng. Mỗi hệ điều hành cần có triển khai JVM riêng. Thiết kế này cho phép cùng một mã bytecode đã biên dịch chạy ở bất cứ nơi nào có cài đặt JVM tương thích.

Tóm tắt bài viết này với: