Thứ 2 - Chủ Nhật, 8h - 21h.
Hãy gọi: 0906 12 56 56

Khi dùng hết bộ nhớ

Một thời gian chạy Java đối phó hoàn toàn khác nhau với việc dùng hết vùng heap Java so với việc dùng hết vùng heap riêng, mặc dù cả hai tình thế có thể làm xuất hiện các dấu hiệu tương tự nhau. Một ứng dụng Java rất khó hoạt động khi vùng heap Java bị cạn kiệt — bởi vì rất khó cho một ứng dụng Java để thực hiện bất cứ việc gì mà không cấp phát các đối tượng. Hiệu năng GC kém và các lỗi OutOfMemoryError báo hiệu một vùng heap đầy được tạo ra ngay khi vùng heap tràn đầy.

 

Trái lại, ngay khi một thời gian chạy Java đã khởi động và ứng dụng ở trong trạng thái ổn định, nó có thể tiếp tục hoạt động với vùng heap riêng đã cạn hết. Không nhất thiết phải chỉ ra bất kỳ hành vi xấu nào, bởi vì các hành động đòi hỏi cấp phát bộ nhớ riêng hiếm xảy ra hơn nhiều so với các hành động đòi hỏi cấp phát vùng heap Java. Mặc dù các hành động yêu cầu bộ nhớ riêng thay đổi tùy theo việc triển khai thực hiện JVM, nhưng sau đây là một số ví dụ phổ biến: bắt đầu một luồng, nạp một lớp và thực hiện một số loại I/O mạng và tệp.

 


Hành vi thiếu bộ nhớ riêng cũng ít nhất quán hơn so với các hành vi thiếu bộ nhớ của vùng heap Java, vì không có điểm kiểm soát duy nhất với các việc cấp phát vùng heap riêng. Trong khi tất cả các việc cấp phát vùng heap Java nằm dưới sự kiểm soát của hệ thống quản lý bộ nhớ Java, thì bất kỳ mã riêng nào — cho dù nó ở bên trong JVM, các thư viện lớp Java hoặc mã ứng dụng — có thể thực hiện một việc cấp phát bộ nhớ riêng và bị thất bại. Sau đó, mã cố gắng thực hiện việc cấp phát ấy có thể xử lý nó như người thiết kế muốn: nó có thể đưa ra một lỗi OutOfMemoryError thông qua giao diện JNI, in một thông báo trên màn hình, hay âm thầm không chạy nữa và thử làm lại sau hoặc làm cái gì đó khác.

 


Việc thiếu một hành vị dự tính trước có nghĩa là không có một cách đơn giản nào để nhận biết sự cạn kiệt bộ nhớ riêng. Thay vào đó, bạn cần phải sử dụng dữ liệu từ hệ điều hành và từ thời gian chạy Java để xác định chẩn đoán đó.

 

Phần tiếp theo: Ví dụ thiếu bộ nhớ riêng