gpt4 book ai didi

Java:OutOfMemoryError 异常和 freeMemory()

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:00:04 32 4
gpt4 key购买 nike

我有以下测试程序:

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());
}
}

如果我运行这个程序,我会得到以下输出:

...

############
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)

尽管 freeMemory() 方法返回有更多可用内存,但为什么我会收到“OutOfMemoryError”异常???是否有办法使用所有的 freeMemory()?

最佳答案

HashMap 类有时会随着其中条目数量的增加而调整大小。即使您显示 300+K 剩余空间,这可能不足以处理哈希桶的大小调整。

void resize(int newCapacity) {
Entry[] oldTable = table;
int oldCapacity = oldTable.length;
if (oldCapacity == MAXIMUM_CAPACITY) {
threshold = Integer.MAX_VALUE;
return;
}
// ***possible big allocation here***
Entry[] newTable = new Entry[newCapacity];
transfer(newTable);
table = newTable;
threshold = (int)(newCapacity * loadFactor);
}

在更一般的意义上,Java 不推荐对堆内存(和整个进程大小)的细粒度期望。有一些后台分配以及堆中尚未回收的对象占用了您可能没有预料到的空间。此外,垃圾收集器在接近满堆时会逐渐使用越来越多的 CPU。您希望在超出预期最大分配大小的大量内存开销下运行。

关于Java:OutOfMemoryError 异常和 freeMemory(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8183343/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com