一尘不染

在HashMap中插入50,000个对象时,为什么会出现OutOfMemoryError?

java

我试图将50,000个对象(因此50,000个键)插入java.util.HashMap<java.awt.Point, Segment>。但是,我不断收到OutOfMemory异常。(这Segment是我自己的课程-重量很轻-
一个String字段和三个int字段)。

线程“主”中的异常java.lang.OutOfMemoryError:Java堆空间
    在java.util.HashMap.resize(HashMap.java:508)
    在java.util.HashMap.addEntry(HashMap.java:799)
    在java.util.HashMap.put(HashMap.java:431)
    在bus.tools.UpdateMap.putSegment(UpdateMap.java:168)

这似乎很荒谬,因为我看到计算机上有足够的可用内存–可用RAM和虚拟内存的HD空间。

Java是否可能在某些严格的内存需求下运行?我可以增加这些吗?

有一些奇怪的限制HashMap吗?我需要自己实施吗?还有其他值得一看的课程吗?

(我正在具有2GB RAM的Intel机器上的OS X 10.5下运行Java5。)


阅读 218

收藏
2020-12-03

共1个答案

一尘不染

您可以通过将-Xmx128m(其中128是兆字节数)传递给Java来增加最大堆大小。我不记得默认大小,但是让我惊讶的是它很小。

您可以使用Runtime类以编程方式检查可用的内存量。

// Get current size of heap in bytes
long heapSize = Runtime.getRuntime().totalMemory();

// Get maximum size of heap in bytes. The heap cannot grow beyond this size.
// Any attempt will result in an OutOfMemoryException.
long heapMaxSize = Runtime.getRuntime().maxMemory();

// Get amount of free memory within the heap in bytes. This size will increase
// after garbage collection and decrease as new objects are created.
long heapFreeSize = Runtime.getRuntime().freeMemory();

(来自Java Developers
Almanac的
示例)

关于Java HotSpot
VM的常见问题
Java 6 GC
Tuning页面中
也部分解决了此问题

2020-12-03