0

Java JVM

Trong ngôn ngữ lập trình java thì JRE (Java Runtime Enviroment) là môi trường thực thi mã bytecode. JRE là triển khai máy ảo của JVM (Java Virtual Machine) - phân tích và thực thi bytecode. Khi chúng ta biết, hiểu về kiến trúc của JVM, nó sẽ giúp chúng ta viết code hiệu quả hơn.
Mục tiêu của bài viết này mình muốn chúng ta cùng tìm hiểu về các thành phần của JVM.

Vậy JVM là gì?

Virtual Machine (hay còn gọi là máy ảo) là một instance của máy vật lý, phân tích và thực thi bytecode.
Java là ngôn ngữ lập trình được sáng lập bởi James Gosling, được phát triển với khái niệm WORA (Write One Run Anywhere), chạy trên máy ảo. Trình biên dịch (compiler) sẽ biên dịch file java thành file .class, sau đó file .class được load vào JVM để thực thi.
Dưới đây là kiến trúc của JVM.

JVM làm việc như thế nào?

Theo mô hình kiến trúc trên, JVM được chia thành 3 hệ thống con chính :

  • Class Loader Subsystem
  • Runtime Data Area
  • Execution Engine

1. Class Loader Subsystem

Chịu trách nhiện load, liên kết và khởi tạo file .class khí nó refer đến một class lần đầu tiên trong thời gian chạy (không phải thời gian biên dịch)

1.1 Loading

Các class sẽ được load bởi thành phần này. BootStrap class Loader, Extension class Loader, và Application class Loader là 3 trình nạp class sẽ giúp thực hiện được điều đó.

  • Boot Strap ClassLoader : chịu trách nhiệm load các class từ classpath, đó là các file .jar . Ưu tiên cao nhất sẽ được trao cho trình nạp class này.
  • Extension ClassLoader : Chịu trách nhiệm load các class nằm trong thư mục jre\lib
  • Application ClassLoader : Chịu trách nhiệm load các class từ được cấu hình ở các đường dẫn (path) được đề cập trong biến môi trường.

Các trình nạp class bên trên tuân theo thuật toán phân cấp trong khi load các class.

1.2 Linking
  • Verify : Bytecode verifier (trình xác minh bytecode) sẽ kiểm tra xem byte code có được tạo ra phù hợp hay không. Nếu xác minh là không thành công, sẽ thông báo lỗi verify.
  • Prepare : Đối với tất cả các static variables memory sẽ được phân bổ và gnas với các giá trị mặc định.
  • Resolve : All symbolic memory references are replaced with the original references from Method Area.
1.3 Initialization

Đây là giai đoạn cuối của Class Loading. Trong giai đoạn này các biến tĩnh (static variables) sẽ được gán với các giá trị ban đầu và static block sẽ được thực thi.

Runtime Data Area

Runtime Data Area được chia thành 5 thành phần chính:

  • Method area : Tất cả dữ liệu level class được lưu trữ ở đây, bao gồm static variables
  • Heap area : Tất cả các đối tượng và các biến, arrays sẽ được lưu trữ ở đây. Method area và Heap area chia sẻ memory cho nhiều luồng, do đó dữ liệu được lưu trữ trở nên không an toàn.
  • Stack area : Đối với mỗi luồng, một seperate runtime stack sẽ được tạo. Khi mỗi phương thức được gọi, mỗi lời gọi sẽ được thực hiện trong stack memory gọi là Stack Frame. Tất cả local variables sẽ được tạo trong stack memory. Stack area là thread-safe, vì nó không chia sẻ resource. Stack Frame được chia làm 3 phần nhỏ:
  • PC Registers : Với mỗi luồng sẽ được chia vào PC Register riêng để giữ địa chỉ của lệnh thực thi hiện tại sau khi lệnh được thực thi. Sau đó PC Register sẽ cập nhậ lệnh tiếp theo.
  • Native Method stacks : Đối với mỗi luồng, một ngăn xếp phương thức riêng sẽ được tạo.

Execution Engine (Công cụ thực thi)

Bytecode sẽ được assign cho Runtime Data Area, và sẽ được thực thi bới Execution Engine. Execution Engine đọc bytecode từng mảng một.

  • Interpreter : Trình thông dịch dịch bytecode nhanh, nhưng thực thi chậm. Nhược điểm của trình thông dịch là khi một phương thức được gọi nhiều lần, mỗi lần cần một thông dịch mới.
  • JIT Compilier : Trình biên dịch JIT vô hiệu hóa nhược điểm của trình thông dịch (interpreter). Execution Engine sẽ sử dụng trợ giúp của trình thông dịch trong việc chuyển đổi bytecode, nhưng khi thấy mã lặp lại , nó sẽ sử dụng trình biên dịch JIT. Nó biên dịch toàn bộ bytecode và thay đổi nó thành mã gốc. Mã này sẽ được sử dụng khi các phương thức bị gọi lặp lại nhiều lần, điều này giúp cảu thiện hiệu năng của hệ thống.
  • Garbage Collector : Thu thập và loại bỏ các đối tượng được khởi tạo nhưng không sử dụng.

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí