Bộ nhớ heap là gì?
Bộ nhớ heap chính là bộ nhớ dùng để lưu trữ các đối tượng được tạo ra trong 1 chương trình Java. Như vậy nếu kích thước bộ nhớ quá nhỏ trong khi số lượng đối tượng được tạo ra lớn hơn dẫn đến tràn bộ nhớ.
Ví dụ cụ thể, bộ nhớ heap mặc định của Java là 64MB. 1 chương trình Java có 1 đối tượng với khoảng 10 thuộc tính kiểu String với độ dài trung bình là 50 ký tự, 1 ký tự 2 bytes như vậy khoảng 100 bytes. Nhân với 10 thuộc tính là 1MB. Nếu chương trình khởi tạo 1 danh sách khoảng 100 đối tượng như vậy lượng bộ nhớ cần dùng là 100MB, chương trình sẽ lập tức bị tràn bộ nhớ.
Có thể thấy khả năng dẫn đến tràn bộ nhớ là rất cao, đặc biệt đối với các chương trình Java lớn.
Cách khắc phục
Giải pháp là tăng bộ nhớ heap. Nói tuy đơn giản nhưng để thực hiện khá phức tạp vì mỗi 1 chương trình Java có cách thiết lập kích thước bộ nhớ heap khác nhau. Có ít nhất 3 cách chỉnh kích thước heap:
- Trong biến môi trường, tạo mới hoặc hiệu chỉnh giá trị của biến có tên JAVA_OPTS. Ví dụ, JAVA_OPTS = -Xms256m -Xmx256m
Xms256m: kích thước khởi tạo của heap là 256 Mb
Xmx256m: kích thước cực đại của heap là 256Mb
- Trong control panel, mở Java Control panel và hiệu chỉnh Runtime Java Environment theo thông số -Xmx256m
- Đối với file jar: java -Xms256m -Xmx256m your_program.jar
- Đối với jetty: vào bin mở file jetty-service.conf và chỉnh như sau:
wrapper.java.initmemory=1024m
wrapper.java.maxmemory= 1024m
Với các ứng dụng khác như Tomcat, Eclipse, Jboss có thể tham khảo cách thiết lập heap size tạo đây