我有以下的测试程序:的Java:OutOfMemoryError异常异常和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());
}
}
如果我运行这个程序,我得到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)
为什么我得到一个“OutOfMemoryError异常“尽管freeMemory()方法返回异常,但有更多的空闲内存?如果有办法使用所有的freeMemory()?
但是,当我使用LinkedList而不是HashMap时,我遇到了同样的问题。在我的真实环境中,我想读取10百万条数据记录,每个数据记录都是一个HashMap,并且我将所有HashMap存储在一个LinkedList中。 jvisualvm告诉我,我的程序可以使用max。 80GB,但它只使用65GB。在这一点上,我得到的例外...... – user1053813
@ user1053813,你可以这样做,但是你需要给你的应用程序提供很多内存,我怀疑有很多GB。内存现在很便宜,所以不一定是个问题。如果你想要更有效地存储数据,我会使用对象而不是HashMap。 (可能小2-3倍)有可能存在某种与操作系统有关的内存障碍,从而阻止您在一个应用程序中使用超过64 GB的内存。您可能会考虑使用直接内存来存储数据,这可能是对象大小的一半,并且使用很少的堆,但是工作量更大。 ;) –