JVM - Java virtual machine
Có thể dịch là máy ảo java
Như bạn thấy mỗi hệ điều hành chạy chương trình của nó với một mã máy khác nhau đó là mã bytecodes. Windows được biên dịch dưới dạng exe còn Linux là .ELF vì vậy hầu hết các phần mềm gặp khó khăn khi viết ra để sử dụng trên nhiều hệ điều hành.
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 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.
Mình vẽ = pain các bạn thông cảm:
Hình ảnh mình họa java thực thi file .java sang mã bytecode bằng trình biên dịch JAVAC chuyển thành mã máy qua compiler JIT
Sau khi Classloader làm xong nhiệm vụ của mình các file sẽ được máy ảo JVM cung cấp bộ nhớ tương ứng với chúng.
-
Class area: đúng như tên gọi của nó, 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: Là nơi các đối tượng khởi tạo bằng toàn tử "new "sẽ được lưu ở đây tại thời điểm chương trình chạy
-
Stak : 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 : Khi JVM thực thi mã, một thanh ghi cục bộ có tên “Program Counter” được sử dụng. Thanh ghi này trỏ tới lệnh đang thực hiện. Khi cần thiết, có thể thay đổi nội dung thanh ghi để đổi hướng thực thi của chương trình. Trong trường hợp thông thường thì từng lệnh một nối tiếp nhau sẽ được thực thi.
-
native method: Nơi chứa tất cả các method native trong chương trình
-
Java Perm: Lưu trữ thông tin của Class được nạp vào và một vài tính năng khác như StringPool (vùng nhớ của biến String) thường được tạo bởi phương thức String.interm(). Khi ứng dụng của bạn chạy, Perm space được lấp đầy nhanh chóng.
Ví dụ: Person person = new Person ();
Heap: lưu đối tượng Person khi ta “new Person ();”
Stack: lưu tham chiếu “person ”.
Perm: lưu thông tin về Class “Person ”.
Execution Engine:
Sau khi lưu Dữ liệu xong chương trinh JVM sẽ biên dịch file .java thành dạng file .class bytecode bằng trình biên dịch javac
Khi file .class được hoàn thành chương trình tiếp tục sử dụng compiler “Just In Time-JIT”. Các trình duyệt thông dụng như Netscape hay IE đều có JIT bên trong để tăng tốc độ thực thi chương trình Java. Mục đích chính của JIT là chuyển tập lệnh bytecode thành mã máy cụ thể cho từng loại CPU. Các lệnh này sẽ được lưu trữ và sử dụng mỗi khi gọi đến.
3: Bởi vì các file .java đều được chuyển sang mã bytecode nên trong quá trình chạy không sợ virus có thể tấn công nên Java được coi là ngôn ngữ có độ bảo mật cao nhất hiện nay