当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么在将50,000个对象插入HashMap时会出现OutOfMemoryError?》经验,为你挑选了2个好方法。

我试图插入约50,000个对象(因此50,000个键)java.util.HashMap.但是,我一直得到一个OutOfMemory异常.(Segment是我自己的课 - 非常轻的重量 - 一个String领域,三个int领域).

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.HashMap.resize(HashMap.java:508)
    at java.util.HashMap.addEntry(HashMap.java:799)
    at java.util.HashMap.put(HashMap.java:431)
    at bus.tools.UpdateMap.putSegment(UpdateMap.java:168)

这看起来非常荒谬,因为我发现机器上有足够的内存 - 无论是在自由RAM还是用于虚拟内存的高清空间.

是否有可能Java运行时有一些严格的内存要求?我可以增加这些吗?

是否有一些奇怪的限制HashMap?我是否必须实施自己的?还有其他值得关注的课程吗?

(我在具有2GB RAM的Intel机器上运行OS X 10.5下的Java 5.)



1> Michael Myer..:

您可以通过将-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页面中也部分解决了这个问题.



2> Michael Myer..:

有些人建议更改HashMap的参数以收紧内存需求.我建议测量而不是猜测 ; 它可能是造成OOME的其他因素.特别是,我建议使用NetBeans Profiler或VisualVM(随Java 6一起提供,但我看到你坚持使用Java 5).

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有