JVM memory Structure
Chủ đề của tháng là Java nên có rất nhiều bài viết về Java. Ngay cả Div QA cũng viết về Java. Để bổ sung cho bài viết JVM Structure của một QA member, mình chọn bài viết về một thành phần lớn nhất và quan trọng nhất của JVM (Java Virtual Machine) đó là Memory structure. Dưới đây là kiến trúc của ...
Chủ đề của tháng là Java nên có rất nhiều bài viết về Java. Ngay cả Div QA cũng viết về Java. Để bổ sung cho bài viết JVM Structure của một QA member, mình chọn bài viết về một thành phần lớn nhất và quan trọng nhất của JVM (Java Virtual Machine) đó là Memory structure.
Dưới đây là kiến trúc của JVM Memory trong tổng thể kiến trúc JVM.
Ở sơ đồ kiến trúc JVM trên thì kiến trúc Memory là Runtime data areas, phần lớn nhất của kiến trúc JVM.
Runtime data areas chính là Memory được phân khi máy ảo Java chạy trên hệ điều hành. Memory của JVM được chia làm 5 phân vùng khác nhau, đó là PC Registers, Java stacks, Native method stacks, Heap, và Method area. Trong Method area có phân vùng con nữa là Runtime Constant Pool.
Trong đó 3 phân vùng PC Register, JVM Stack, và Native Method Stack được tạo cho từng Thread. 3 phân vùng sau là Heap, Method area, Runtime Contant Pool được chia sẻ (dùng chung) cho các Thread.
-
PC Reigster: PC (Program Counter) register được tạo ra khi khởi tạo một thread và cho riêng thread ấy.
-
JVM Stack: JVM stack được tạo ra khi một thread được khởi tạo và cho riêng thread ấy. JVM stack là nơi mà JVM sẽ push hay pop các Stack Frame.
-
Stack Frame: Một Stack Frame được tạo ra bất cứ khi nào một method được thực thi trong JVM. Và Stack Frame ấy được Push vào JVM Stack của thread. Khi method này kết thúc thì Stack Frame được remove khỏi JVM Stack. Mỗi Stack Frame có chứa Local Variable Array (mảng biến cục bộ), Operand Stack (Không gian làm việc thực tế), và reference đến Constant pool của class. Kích thước của mảng biến cục bộ và Không gian làm việc thực tế được xác định ngay khi biên dịch. Do vậy mà kích thước của Stack frame cũng cố định khi biên dịch.
-
Local Variable Array: Là nơi chứa các biến của method chúng được đánh index. Bắt đầu từ 0 là reference object (object được lưu ở Heap), tiếp theo là các parameter của method, sau parameter là biến kiểu primitive.
-
Operand stack: Là vùng nhớ làm việc của method. Là nơi mà method sẽ push hay pop các local variable trong quá trình method được thực thi. Ta xét mô phỏng hoạt động của giữa Local Variable Array và Operand Stack qua method đơn giản sau.
-
private int addMthed(int firstNum, int secondNum) { int total = firstNum + secondNum; return total; }
- Native method stack: Là vùng nhớ chứa mã bycode của các ngôn ngữ khác không phải Java là C/C++. Mã C/C++ được gọi thông qua JNI (Java Native Interface).
- Heap: Là vùng nhớ chứa các array và object (class instance). Là vùng nhớ chính của JVM. Nó được tạo ra khi JVM start-up. Là vùng nhớ chia sẻ giữa các thread khác nhau của cùng một ứng dụng. Nghĩa là chúng có thể can thiệp và làm thay đổi giá trị. Do vậy ta phải quan tâm đến việc đồng bộ (synchronization) khi lập trình multi-thread.
- Garbage Collection: Là trình quản lý bộ nhớ heap của JVM. Khi một object hay array không còn thread nào tham chiếu đến thì nó là đối tượng "thu rọn" của Garbage collector. Trong khuôn khổ bài viết này không thể trình bày chi tiết về Garbage collector được. Bài kết tiếp mình sẽ trình bày cụ thể hơn về Garbage collector.
Mặc định kích thước lớn nhất của heap là 64 Mb. Ta có thể cấu hình độ lớn của Heap bằng lệnh Xmx<1024> - thiết lập kích thước lớn nhất cho heap. Xms<512> - thiết lập kích thước khởi tạo heap
-
Method area: Chia sẻ cho các thread, được tạo khi JVM start-up. Method area chứa class reference, các runtime constant pool, mã bytecode cho từng class và interface.
- Runtime constant pool: Gồm các numeric constant, field reference, method reference, và các attribute.
-