当前位置: 首页 > 面试题库 >

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

杜曜灿
2023-03-14
问题内容

我试图将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。)


问题答案:

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



 类似资料:
  • 问题内容: 我是泛型新手,所以不确定我的问题的答案是否是真的。在下面的代码中,对一个对象条目的键进行大小写需要什么? 它似乎很容易被替换 更多参考: 问题答案: 这是一种极端的优化措施,对于通用编程实践来说可能不是必需的。这是一个可以回答您问题的讨论。下面的语句是从该帖子中复制的: 这是Doug Lea流行的一种编码风格。这是一个极端的优化,可能没有必要。您可以期望JIT进行相同的优化。(您可以尝

  • 问题内容: 我有一个类MyThread。在那我有一个方法示例。我试图从相同的对象上下文中运行它。请看一下代码: 看起来很简单,不是吗。但是当我运行它时,我得到这个错误 现在,我就在那里使用该方法。那怎么了 请帮忙 编辑:这是堆栈跟踪 我这样称呼它 抱歉,我无法发布redisOps类代码。但我可以向您保证,它的效果很好 问题答案: 您的缩进已弄糟,并且您混用了制表符和空格。运行脚本进行验证。

  • 我想在RxJava中实现一个下载一些文件的处理队列。我想下载的文件数量可能高达100个左右。 一切都是在Android上使用RxJava 1.1.1开发的 我做错了什么?

  • 我已经调整了控制器构造函数和fxml,所以除了fxml构造和fxml加载之外,控制器的所有fxml设置都在fxml中。这里是我的控制器:

  • 我正在尝试序列化然后反序列化多个对象。我可以毫无问题地写入文件,但当选择反序列化选项时,我会得到以下堆栈跟踪。以前,我可以成功地序列化和反序列化一个对象。

  • 问题内容: 当我运行以下代码时: 我得到一个异常说: 为什么会出现此异常? 编辑:tmpList是一个LinkedList,其每个节点都包含DepConfAttr类型的对象。 我正在基于内存(首先是最高内存)对tmpList进行排序,这是DepConfAttr对象的属性之一。 上面的代码反映了我要通过以下代码实现的目标 问题答案: 为什么会出现此异常? 您要遍历列表,而不是通过迭代器从列表中删除一