- Theo hiểu biết của tôi, không gian Heap chỉ bị chiếm bởi các biến cá thể. Nếu điều này là chính xác, thì tại sao lỗi này xảy ra sau khi chạy tốt đôi khi vì không gian cho các biến ví dụ được phân bổ tại thời điểm tạo đối tượng.
Điều đó có nghĩa là bạn đang tạo nhiều đối tượng hơn trong ứng dụng của mình trong một khoảng thời gian liên tục. Các đối tượng mới sẽ được lưu trữ trong bộ nhớ heap và đó là lý do cho sự phát triển trong bộ nhớ heap.
Heap không chỉ chứa các biến cá thể. Nó sẽ lưu trữ tất cả các kiểu dữ liệu không nguyên thủy (Đối tượng). Thời gian tồn tại của các đối tượng này có thể ngắn (khối phương thức) hoặc dài (cho đến khi đối tượng được tham chiếu trong ứng dụng của bạn)
- Có cách nào để tăng không gian đống?
Đúng. Hãy xem bài báo oracle này để biết thêm chi tiết.
Có hai tham số để thiết lập kích thước heap:
-Xms:, đặt kích thước heap ban đầu và tối thiểu
-Xmx:, đặt kích thước đống tối đa
- Tôi nên thực hiện những thay đổi gì đối với chương trình của mình để Chương trình sẽ chiếm ít dung lượng hơn?
Nó phụ thuộc vào ứng dụng của bạn.
Đặt bộ nhớ heap tối đa theo yêu cầu ứng dụng của bạn
Không gây rò rỉ bộ nhớ trong ứng dụng của bạn
Nếu bạn phát hiện thấy rò rỉ bộ nhớ trong ứng dụng của mình, hãy tìm nguyên nhân gốc rễ với sự trợ giúp của các công cụ cấu hình như MAT , Visual VM , jconsole , v.v. Khi bạn tìm ra nguyên nhân gốc rễ, hãy sửa lỗi rò rỉ.
Ghi chú quan trọng từ bài báo oracle
Nguyên nhân: Thông báo chi tiết Không gian heap Java cho biết không thể cấp phát đối tượng trong heap Java. Lỗi này không nhất thiết ám chỉ rò rỉ bộ nhớ.
Lý do có thể:
- Cấu hình không phù hợp (không phân bổ đủ bộ nhớ)
- Ứng dụng vô tình giữ các tham chiếu đến các đối tượng và điều này ngăn không cho các đối tượng được thu gom
- Các ứng dụng sử dụng quá nhiều trình hoàn thiện. Nếu một lớp có phương thức finalize, thì các đối tượng của kiểu đó sẽ không bị thu hồi dung lượng tại thời điểm thu gom rác. Nếu chuỗi trình hoàn thiện không thể theo kịp, với hàng đợi hoàn thiện, thì heap Java có thể đầy và loại ngoại lệ OutOfMemoryError này sẽ được ném ra .
Một lưu ý khác, hãy sử dụng các thuật toán thu gom rác tốt hơn ( CMS hoặc G1GC )
Hãy xem câu hỏi này để hiểu G1GC