Trong Máy Ảo Java (JVM), bộ nhớ được tổ chức thành các khu vực (memory areas) khác nhau để lưu trữ cấu trúc dữ liệu và thông tin cần thiết cho việc thực thi chương trình. Các khu vực bộ nhớ chính trong JVM bao gồm:
Heap Memory
- Đây là khu vực bộ nhớ được JVM sử dụng để lưu trữ các đối tượng được tạo ra bởi các chương trình Java.
- Heap là một phần bộ nhớ được chia sẻ giữa tất cả các luồng của ứng dụng.
- Quản lý bởi bộ thu gom rác (Garbage Collector), tự động giải phóng bộ nhớ khi các đối tượng không còn được tham chiếu.
Method Area (MetaSpace từ Java 8)
- Method Area lưu trữ thông tin về cấu trúc của mỗi class như runtime constants, trường và dữ liệu của phương thức, code của phương thức (bao gồm cả phương thức constructor).
- Trong các phiên bản Java trước Java 8, khu vực này thường được gọi là Permanent Generation (PermGen). Từ Java 8, PermGen đã được thay thế bởi MetaSpace.
- MetaSpace lưu trữ thông tin class trong bộ nhớ native của hệ thống, không giới hạn bởi JVM.
Stack Memory
- Mỗi luồng trong ứng dụng Java có một stack riêng, được sử dụng để lưu trữ thông tin về các cuộc gọi phương thức và các biến cục bộ.
- Khi một phương thức được gọi, một block bộ nhớ (frame) được tạo trên stack chứa thông tin về các biến cục bộ và thực thi của phương thức đó.
- Stack là khu vực bộ nhớ có kích thước cố định hoặc động tùy thuộc vào ngôn ngữ lập trình và cài đặt JVM.
Program Counter (PC) Register
- Mỗi luồng Java có một PC register. Đây là một bộ đếm chỉ định địa chỉ của JVM của lệnh máy hiện đang được thực thi.
- Nếu luồng đang thực hiện một phương thức Java (không phải native), PC register chứa địa chỉ của lệnh JVM tiếp theo được thực thi. Nếu luồng đang thực hiện một phương thức native, giá trị của PC register không xác định.
Native Method Stack
- Native Method Stack được JVM sử dụng cho các phương thức native (phương thức không phải Java).
- Tương tự như stack memory, nhưng dành riêng cho các cuộc gọi đến các phương thức native của hệ thống hoặc thư viện bên ngoài.
Các khu vực bộ nhớ này giúp JVM quản lý và thực thi các chương trình Java một cách hiệu quả, đảm bảo rằng các tài nguyên hệ thống được sử dụng một cách tối ưu và an toàn.
Comments