tôi có chương trình thử nghiệm sau đây:Java: Exception OutOfMemoryError và freeMemory()
public static void main(String[] args)
{
HashMap<Integer, String> hm = new HashMap<Integer,String>();
int i = 1;
while(true)
{
hm.put(i, "blah");
i++;
System.out.println("############");
System.out.println("Max mem: " + Runtime.getRuntime().maxMemory());
System.out.println("Total mem: " + Runtime.getRuntime().totalMemory());
System.out.println("Free mem:" + Runtime.getRuntime().freeMemory());
}
}
Nếu tôi chạy chương trình này, tôi nhận được đầu ra follwing:
...
############
Max mem: 8060928
Total mem: 8060928
Free mem:334400
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.HashMap.addEntry(Unknown Source)
at java.util.HashMap.put(Unknown Source)
at Test.main(Test.java:14)
Tại sao tôi nhận được một "OutOfMemoryError "Ngoại lệ mặc dù phương thức freeMemory() trả về rằng có nhiều bộ nhớ trống hơn ??? Nếu có cách nào để sử dụng tất cả các freeMemory()?
Nhưng khi tôi sử dụng LinkedList thay vì HashMap, tôi nhận được cùng một vấn đề. Trong bối cảnh thực sự của tôi, tôi muốn đọc 10 triệu bản ghi dữ liệu, mỗi bản ghi là một HashMap và tôi lưu trữ tất cả các HashMaps trong một LinkedList. Và jvisualvm nói với tôi rằng chương trình của tôi có thể sử dụng tối đa. 80GB, nhưng nó chỉ sử dụng 65GB. Tại thời điểm này tôi nhận được ngoại lệ ... – user1053813
@ user1053813, Bạn có thể làm điều này, nhưng bạn sẽ cần phải cung cấp cho ứng dụng của bạn rất nhiều bộ nhớ, nhiều GB tôi nghi ngờ. Bộ nhớ là khá rẻ những ngày này để không phải là một vấn đề. Nếu bạn muốn dữ liệu được lưu trữ hiệu quả hơn, tôi sẽ sử dụng các đối tượng thay vì HashMap. (có thể nhỏ hơn 2-3 lần) Có thể có một số loại rào cản bộ nhớ liên quan đến hệ điều hành ngăn bạn sử dụng hơn 64 GB trong một ứng dụng. Bạn có thể xem xét sử dụng bộ nhớ trực tiếp để lưu trữ dữ liệu, điều này có thể bằng một nửa kích thước của các đối tượng và sử dụng rất ít heap nhưng có nhiều công việc hơn. ;) –