Hiểu ngay Máy ảo Java (JVM) và kiến ​​trúc của Máy ảo Java

Ngày đăng: 28/03/2019   -    Cập nhật: 06/03/2020

Bài trước chúng ta đã được nghe về "Máy ảo Java". Vậy Máy ảo Java (JVM) là gì? nó hoạt động như thế nào? thì chúng ta sẽ tìm hiểu trong bài này.


Hiểu về máy ảo Java sẽ giúp bạn trả lời được rất nhiều thắc mắc đấy khi Tự Học Java đấy.

Máy ảo Java (Java Virtual Machine) là gì?


Máy ảo Java tên tiếng Anh là Java Virtual Machine (viết tắt là JVM) là:


  • Một Engine cung cấp Runtime Environment (môi trường chạy mã) để điều khiển mã Java hoặc các ứng dụng.
  • Nó chuyển đổi Java Bytecode thành ngôn ngữ máy tính hiểu được.
  • JVM là một phần của JRE (Môi trường chạy Java - Java Run Environment). Nó là viết tắt của Java Virtual Machine


Trong các ngôn ngữ lập trình khác, trình biên dịch (compiler) tạo mã máy cho một hệ thống cụ thể.


Tuy nhiên, trình biên dịch Java (Java Compiler) tạo mã cho một máy ảo được gọi là Máy ảo Java (JVM).


Đầu tiên, mã Java được tuân thủ theo bytecode. Bytecode này được diễn giải trên các máy khác nhau Giữa hệ thống máy chủ và Java Source, Bytecode là ngôn ngữ trung gian.


JVM chịu trách nhiệm phân bổ không gian bộ nhớ.



Cách Máy ảo Java hoạt động

Cách Máy ảo Java hoạt động

 

Trong bài học này, qua từng phần bạn sẽ hiểu về:


  1. Máy ảo Java là gì?
  2. Kiến trúc của Máy ảo Java
  3. Quá trình thực thi và biên dịch mã của phần mềm
  4. Quá trình thực thi và biên dịch mã của C
  5. Quá trình thực thi và biên dịch mã của Java
  6. Tại sao Java vừa Thông dịch (Interpreted) vừa Biên dịch (Compiled)?
  7. Tại sao Java lại chậm?


1. Kiếm trúc của Máy ảo Java (Java Architecture)

Hãy hiểu Kiến trúc của JVM. Nó chứa classloader, memory area, execution engine v.v.


Kiến trúc của Máy ảo Java

Kiến trúc của Máy ảo Java

a) ClassLoader



ClassLoader là một hệ thống con được sử dụng để tải các class file. Nó thực hiện ba chức năng chính: Loading, Linking và Initialization (Khởi tạo)

b) Method Area



JVM Method Area lưu trữ các cấu trúc lớp (class) như: metadata, the constant runtime pool và code của các method.

c) Heap



Tất cả các Object, các biến đối tượng liên quan và mảng (Array) của chúng được lưu trữ trong heap. Bộ nhớ này là phổ biến và được chia sẻ trên nhiều luồng.

4) JVM languae Stacks



JVM languae Stacks lưu trữ các biến cục bộ (local variables) và một phần kết quả của nó. Mỗi luồng có JVM stack riêng, được tạo đồng thời khi luồng được tạo.


Một khung mới được tạo bất cứ khi nào một phương thức được gọi và nó sẽ bị xóa khi quá trình gọi phương thức hoàn tất.


5) PC Register



PC Register lưu trữ địa chỉ của hướng dẫn máy ảo Java hiện đang thực thi. Trong Java, mỗi luồng có thanh ghi PC riêng biệt.

6) Native Method Stacks



Native Method Stacks giữ hướng dẫn của mã gốc phụ thuộc vào thư viện riêng. Nó được viết bằng ngôn ngữ khác thay vì Java.

7) Execution Engine



Execution Engine là một loại phần mềm được sử dụng để kiểm tra phần cứng, phần mềm hoặc hệ thống hoàn chỉnh.


Công cụ thực hiện kiểm tra không bao giờ mang bất kỳ thông tin nào về sản phẩm được kiểm tra.



8) Native Method interface



Native Method interface là một Famework. Nó cho phép mã Java đang chạy trong JVM được gọi bởi các thư viện và ứng dụng gốc.


Native Libraries là một tập hợp các thư viện riêng (C, C ++) cần thiết cho Execution Engine (công cụ thực thi).




2. Quá trình thực thi và biên dịch mã phần mềm

Trước tiên, để viết và thực hiện chương trình phần mềm, bạn cần có những điều sau đây:


1) Editor - Để nhập chương trình của bạn vào, có thể sử dụng notepad cho trình biên dịch


2) Compiler - Để chuyển đổi chương trình ngôn ngữ cao của bạn thành mã máy gốc


3) Linker - Để kết hợp các tệp chương trình khác nhau trong chương trình chính của bạn với nhau.


4) Loader - Để tải các tệp từ thiết bị lưu trữ thứ cấp của bạn như Đĩa cứng, Flash Drive, CD vào RAM để thực thi. Việc tải được tự động thực hiện khi bạn thực thi mã của mình.


5) Execution - Thực thi mã được xử lý bởi hệ điều hành & bộ xử lý của bạn.


Hãy xem video để hiểu rõ hơn về kiến trúc của Máy ảo Java:



 

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

Để hiểu quá trình biên dịch Java trong Java. Trước tiên chúng ta hãy xem nhanh quá trình compiling (biên dịch) và Linking (liên kết) trong C.


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



Mô tả Quá trình biên dịch mã C - 1

Mô tả Quá trình biên dịch mã C - 1


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

Mô tả Quá trình biên dịch mã C - 2

Mô tả Quá trình biên dịch mã C - 2


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

Mô tả Quá trình biên dịch mã C - 3

Mô tả Quá trình biên dịch mã C - 3


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


Mô tả Quá trình biên dịch mã C - 4

Mô tả Quá trình biên dịch mã C - 4

 

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 Linker. Linker sẽ kết hợp tất cả các tệp này lại với nhau và tạo tệp .exe


Mô tả Quá trình biên dịch mã C - 5

Mô tả Quá trình biên dịch mã C - 5

 

Trong quá trình chạy chương trình, một chương trình Loader sẽ tải a.exe vào RAM để thực thi.


Mô tả Quá trình biên dịch mã C - 6

Mô tả Quá trình biên dịch mã C - 6
 

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

Hãy xem xét quá trình này cho JAVA. Trong main của bạn, bạn có hai method f1 và f2.

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

Mô tả Quá trình biên dịch mã Java trong JVM - 1

Mô tả Quá trình biên dịch mã Java trong JVM - 1


Trình biên dịch sẽ biên dịch ba tệp và tạo ra 3 tệp .class tương ứng chứa BYTE code. Không giống như C, không có liên kết được thực hiện.


Java VM hoặc Máy ảo Java nằm trên RAM. Trong quá trình thực thi, sử dụng class loader, class files được đưa vào RAM. Tại đây BYTE code được xác minh cho tính bảo mật.



Mô tả Quá trình biên dịch mã Java trong JVM - 2

Mô tả Quá trình biên dịch mã Java trong JVM - 2

 

Tiếp theo, Execution Engine sẽ chuyển đổi bytecode thành mã máy gốc. Đây chỉ là trong thời gian biên dịch. Đây là một trong những lý do chính tại sao Java tương đối chậm.


Mô tả Quá trình biên dịch mã Java trong JVM - 3

Mô tả Quá trình biên dịch mã Java trong JVM - 3

 

NOTE: JIT or Just-in-time compiler là một phần của Java Virtual Machine (JVM). Nó thông dịch một phần của bytecode có chức năng tương tự cùng một lúc.
 

6. Tại sao Java vừa thông dịch vừa biên dịch?

Ngôn ngữ lập trình được xếp loại như sau:

  • Ngôn ngữ bậc cao (Higher-Level): C++, Java
  • Ngôn ngữ bậc trung (Middle-Level): C
  • Ngôn ngữ cấp thấp (Low-Level)
  • Cuối cùng là cấp độ thấp nhất như: Ngôn ngữ máy

 
Trình biên dịch (compiler) 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 độ khác. Ví dụ chuyển đổi chương trình C thành mã máy.


Trình Biên dịch Java chuyển đổi mã Java cấp cao thành bytecode (cũng là một loại mã máy).


Trình Thông dịch (Interpreter) là một chương trình chuyển đổi một chương trình ở cấp độ này sang ngôn ngữ lập trình khác ở cùng cấp độ. Ví dụ chuyển đổi chương trình Java thành C.


Trong Java, trình tạo mã Just-In-Time chuyển đổi bytecode thành mã máy gốc có cùng cấp độ.


Do đó, Java vừa được biên dịch cũng như thông dịch.



7. Tại sao Java lại chậm?


Hai lý do chính đằng sau khiến Java chậm là:

 
  • Dynamic Linking: Không giống như C, trong Java liên kết được thực hiện lúc mỗi khi chương trình chạy
  • Run-time Interpreter: Việc chuyển đổi bytecode thành mã máy gốc được thực hiện vào thời điểm mã chạy. Chứ không được chuyển đổi trước rồi mới chạy. Điều này là lý do làm cho Java chậm.


Tuy nhiên, phiên bản mới nhất của Java đã giải quyết các vấn đề tắc nghẽn về hiệu năng ở mức độ lớn.


* Dĩ nhiên là Java thường chậm hơn C/C++ thôi, còn tốc độ vẫn là niềm tự hào của Java.



Tổng kết


Như vậy, bài tìm hiểu về Máy ảo trong Java chúng ta đã biết về:

 
  • Máy ảo JVM hoặc Java là công cụ điều khiển Mã Java. Nó chuyển đổi mã byte Java thành ngôn ngữ máy.
  • Trong JVM, mã Java được biên dịch thành mã byte. Mã byte này được giải thích trên các máy khác nhau.
  • JIT hoặc Just-in-time là một phần của Máy ảo Java (JVM). Nó được sử dụng để tăng tốc thời gian thực hiện.
  • So với các trình biên dịch khác, Java có thể bị chậm khi thực thi.


> Tham gia ngay Khóa học Java Fullstack với chuyên gia doanh nghiệp phần mềm hàng đầu để nhanh chóng gia lập làng công nghệ.

---
HỌC VIỆN ĐÀO TẠO CNTT NIIT - ICT HÀ NỘI
Dạy học Lập trình chất lượng cao (Since 2002). Học làm Lập trình viên. Hành động ngay!
Đc: Tầng 3, 25T2, N05, Nguyễn Thị Thập, Cầu Giấy, Hà Nội
SĐT: 02435574074 - 0914939543 - 0353655150 
Email: hello@niithanoi.edu.vn
Fanpage: https://facebook.com/NIIT.ICT/
 
#niit #niithanoi #niiticthanoi #hoclaptrinh #khoahoclaptrinh #hoclaptrinhjava #hoclaptrinhphp #java

Bình luận Facebook
Cùng danh mục
Đăng ký tư vấn
Nhân viên gọi điện tư vấn miễn phí sau khi đăng ký
Được cập nhật các ưu đãi sớm nhất
Hotline: 0383180086
Tên không được để trống
Số điện thoại không được để trống
Email không được để trống
Hãy đăng ký để nhận những thông tin mới nhất về học bổng mới nhất tại NIIT - ICT Hà Nội
top
Đóng lại Đăng ký học tại NIIT - ICT Hà Nội
6260+ học viên đã theo học tại NIIT - ICT Hà Nội và có việc làm tốt trong ngành lập trình. Nắm lấy cơ hội ngay hôm nay!
Chọn khóa học
  • KHÓA HỌC LẬP TRÌNH FRONT END VỚI REACT.JS
  • KHÓA HỌC LẬP TRÌNH PHP WEB
  • Khóa học PHP Full stack [2023] cho người mới bắt đầu
  • Khóa học BIG DATA với Hadoop và Spark
  • Khóa học Lập trình Android tại Hà Nội
  • [Tuyển sinh 2023] Lập trình viên Quốc tế DigiNxt
  • Khóa học Tiền lương & Phúc lợi (C&B Excel) tại Hà Nội
  • LẬP TRÌNH GAME
    • Khóa học Lập trình Game Unity
  • LẬP TRÌNH WEB FRONT END
    • KHÓA HỌC PYTHON HƯỚNG ĐỐI TƯỢNG
    • KHÓA HỌC ANGULAR & TYPESCRIPT (FRONT END)
  • LẬP TRÌNH WEB BACK END
    • LẬP TRÌNH JAVA WEB VỚI FRAME WORK
    • Lập trình Web với Django
    • Lập trình PHP với Laravel Framework
  • CHƯƠNG TRÌNH ĐÀO TẠO ỨNG DỤNG CÔNG NGHỆ
    • Khóa học Tiền lương & Phúc lợi (C&B Excel) tại TP HCM
  • LẬP TRÌNH WEB FULL STACK
    • Khóa học Java Full stack (IJFD)
  • LẬP TRÌNH MOBILE
    • FRONT-END VỚI REACTJS VÀ REACT NATIVE
    • Lập trình Android Nâng cao
  • ĐÀO TẠO CHO DOANH NGHIỆP
    • KHÓA HỌC BUSINESS ANALYSIC TỪ CƠ BẢN ĐẾN NÂNG CAO 2023
    • Khóa học Magento: Làm chủ CMS TMĐT lớn nhất
    • Khóa học IOT: Xây dựng Sản phẩm IOT với Raspberry Pi
    • Khóa học Automation Testing Chuyên nghiệp
  • KHÓA HỌC DỰ ÁN
    • Học sử dụng bộ Office: Word, Excel, Power Point, Mail chuyên nghiệp
  • KHÓA HỌC KHÁC
    • VBA Excel Toàn Tập (Cơ Bản - Nâng Cao)
    • VBA Excel Nâng cao
    • Khóa học JMeter: Performance Testing
    • Khóa học Tester đạt chuẩn Quốc tế ISTQB Foundation Level
    • Khoá Học Tester đạt chuẩn quốc tế ISTQB Advanced Level
Bạn chưa chọn khóa học cần đăng ký
Tên không được để trống
Số điện thoại không được để trống
Email không được để trống
Đăng ký học thành công!
Cảm ơn bạn đã đăng ký học tại NIIT - ICT HÀ NỘI!