THÔNG TIN NÓNG:

JVM và Bytecode là gì? Nó hoạt động như thế nào?

2022-07-29 14:10:02

JVM là gì? Bytecode là gì? Nó hoạt động như thế nào?

JVM là gì?

JVM (Java Virtual Machine) là 1 máy ảo java – nó được dùng để thực thi các chương trình Java hay hiểu nôm na là trình thông dịch của Java. Nó cung cấp môi trường để code java có thể được thực thi. Chương trình Java khi biên dịch sẽ tạo ra các mã máy gọi là bytecodes. Như bạn thấy mỗi hệ điều hành chạy chương trình của nó ứng với một mã máy khác nhau đó là mã bytecodes, ví dụ: Windows được biên dịch dưới dạng exe còn Linux là .ELF…

Định nghĩa JVM

Tóm gọn lại là mỗi nền tảng/hệ điều hành khác nhau (Windows, Android, Linux…) lại có một loại JVM khác nhau được cài đặt. Nói Java đa nền tảng, thực chất thì nó được hỗ trợ JVM trên nhiều nền tảng. Chương trình Java chạy được trên Window/Linux/IOS vì nó có JVM chạy được trên các nền tảng đó, vì vậy mới hiểu ý nghĩa là lập trình Java một nơi nhưng chạy được nhiều chỗ là do JVM này thực hiện.

Định nghĩa JVM

Máy ảo java được sinh ra với 3 mục đích chính

  • Dịch mã java ra mã máy chạy được trên các hệ điều hành khác nhau
  • Tăng tốc độ
  • Nâng cao độ bảo mật và tránh virus phá source code

JVM thực hiện các công việc chính sau đây

  • Tải code (các class, resource)
  • Kiểm tra code (kiểm tra code có đúng cú pháp không, có bị lỗi không, tất nhiên nếu code có lỗi thì sẽ không chạy được chương trình rồi)
  • Thực thi code
  • Cung cấp môi trường runtime

JVM có 3 thành phần chính

  • Class Loader: Tìm kiếm và load các file *.class vào vùng nhớ của java dưới dạng bytecode
  • Data Area: vùng nhớ hệ thống cấp phát cho Java Virtual Machine
  • Execution Engine: chuyển các lệnh của JVM trong file *.class thành các lệnh của máy, hệ điều hành tương ứng và thực thi chúng.

Cơ chế thực hiện

Sau khi Classloader tìm và load các file .class, các file này sẽ được máy ảo JVM cung cấp bộ nhớ tương ứng với chúng.

Cơ chế thực hiện JVM
  • Class (Method) area: là vùng nhớ cấp phát cho class (Method) trong đó lại phân chia thành: heap, stack, PC register, native method stack
  • 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: Các phương thức và tham chiếu tới đối tượng địa phương được lưu trữ trong Stack. Mỗi Thread quản lý một stack. Khi phương thức được gọi, nó được đưa vào đỉnh của Stack. Stack lưu trữ trạng thái của phương thức bao gồm: dòng code thực thi, tham chiếu tới đối tượng địa phương. Khi phương thức chạy xong, vùng nhớ (dòng code thực thi, tham chiếu tới đối tượng địa phương) được đẩy ra khỏi stack và tự động giải phóng.
  • PC register (Program Counter Register): 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: Nơi chứa tất cả các method native trong chương trình
  • Execution Engine: Nó bao gồm: Một bộ xử lý ảo, một phiên dịch để đọc dòng bytecode sau đó thực hiện các hướng dẫn và cuối cùng là trình biên dịch Just-In-Time (JIT). JIT biên dịch các phần của mã byte có chức năng tương tự như cùng một lúc, và do đó làm giảm số lượng thời gian cần thiết cho compilation.

* Thuật ngữ: trình biên dịch là đề 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ể.

Bytecode là gì?

Bytecode (còn gọi là portable code hay intermediate code), nó là kết quả của mã nguồn sau khi được biên dịch bởi Compiler.

Ví dụ:

Ta có file mã nguồn hello.cpp:

#include <iostream>

Cho là gì nhận là gì? Ý nghĩa của cho và nhận

using namespace std;

int main() {

cout << "Hello World" << endl;

}

Sau khi biên dịch, ta sẽ có file bytecode hello.obj, mở bằng Visual Studio, nó sẽ giống như thế này:

0000000   4C 01 72 01 FC 72 BF 5B   57 71 00 00 93 04 00 00

0000010   00 00 00 00 2E  64 72 65   63 74 76 65 00 00 00 00

0000020   00 00 00 00 B1  01 00 00   E4 39 00 00 00 00 00 00

............   ....................................   ...................................

Nhân viên hành chính nhân sự tiếng anh là gì? Cách tính kpi cho nhân viên hành chính

Mục đích của bytecode là gì?

Không giống như mã nguồn là thứ mà chúng ta có thể đọc dễ dàng, bytecode được tạo ra bởi Compiler với mục đích:

  • Dễ dàng đọc và được thực thi hiệu quả bởi các chương trình phần mềm thực thi.
  • Bytecode ở vị trí trung gian giữa mã nguồn (code) và mã máy (machine code), cho nên nó giảm thiểu khả năng phụ thuộc phần cứng và hệ điều hành, tức là cùng một mã bytecode có thể thực thi được trên nhiều hệ điều hành khác nhau.
  • Bytecode còn được dùng để thực thi trực tiếp trên các máy ảo như JVM (Java - Java Virtual Machine), CLR (C# - Common Language Runtime) hay PVM (Python - Python Virtual Machine).

Đuôi mở rộng của file bytecode trong các ngôn ngữ lập trình phổ biến

  • Python: hello.py → hello.pyc
  • C++: hello.cpp → hello.obj
  • Java: hello.java → hello.class

Ví dụ quá trình chuyển từ mã nguồn (code) → bytecode → được thực thi bởi JVM → mã máy (machine code) trong Java:

Bytecode

Bytecode trong Java là gì?

Bytecode trong Java là gì? Bytecode là lý do khiến java là nền tảng độc lập, ngay sau khi một chương trình Java được biên soạn bytecode được tạo ra. Nói chính xác hơn, Bytecode Java là mã máy ở dạng tệp. Class.

Bytecode là tập lệnh cho Máy ảo Java (JVM) và hoạt động tương tự như trình biên dịch.

Bytecode trong Java hoạt động như thế nào?

Khi một chương trình Java được thực thi, các trình biên dịch biên dịch đoạn mã và một Bytecode được tạo ra cho mỗi phương thức trong chương trình đó dưới dạng một file .class.

Chúng ta cũng có thể chạy bytecode này trên bất kỳ nền tảng nào khác. Nhưng bytecode là một mã không thể tự chạy được, nó yêu cầu và dựa vào trình thông dịch. Đây là nơi JVM đóng một phần quan trọng.

Bytecode được tạo sau khi quá trình biên dịch được chạy bởi máy ảo Java. Các tài nguyên cần thiết cho việc thực thi được cung cấp bởi máy ảo Java để thực thi trơn tru, gọi bộ xử lý để phân bổ tài nguyên.

Bytecode trong Java và mã máy khác nhau như thế nào?

Sự khác biệt chính giữa mã máy và bytecode là mã máy là một tập hợp các hướng dẫn bằng ngôn ngữ máy hoặc kiểu nhị phân có thể được CPU thực thi trực tiếp. Trong khi bytecode là mã không thể chạy và được tạo bằng cách biên dịch mã nguồn dựa vào trình thông dịch để được thực thi.

Ưu điểm của Bytecode trong Java

Sau đây là một vài lợi thế của Bytecode:

  • Nó giúp đạt được sự độc lập nền tảng, đó là một trong những lý do khiến James Gosling bắt đầu hình thành Java.
  • Bộ hướng dẫn cho một JVM có thể khác nhau từ hệ thống này sang hệ thống khác nhưng tất cả đều có thể thông dịch được Bytecode.
  • Bytecode là các mã không thể chạy được mà phải dựa trên tính khả dụng của trình thông dịch, đây là lúc JVM phát huy tác dụng.
  • Nó là một mã ngôn ngữ cấp máy chạy trên JVM.
  • Nó bổ sung tính di động cho Java, “write once, read anywhere”.

Hy vọng bài viết JVM và Bytecode là gì? Nó hoạt động như thế nào?giúp bạn hiểu hơn về JVM và Bytecode. Mọi thông tin chỉ giúp bạn tham khảo.

CV là gì? Cách làm CV xin việc chất lượng chinh phục nhà tuyển dụng

TAGS
Scroll To Top