我有个内存不足的错误。我有一个大范围的输入(2^40),这是太大了,一次举行。每个输入都是一个 String[]
.
相反,我认为应该对每个输入运行测试程序,将结果写入文件,然后丢弃输入。这个 length
最长输入的最大值是42,所以这不是导致溢出的错误。我想我不懂垃圾收集。 PowerSet
就像一个懒散的列表-结果直到 .next()
被称为。每个结果返回 baseSet
. baseSet
是长度为40的字符串[]。 runTests
对输入进行一些分析并将其写入文件。
PowerSet argSetSet = powerset(baseSet);
while (argSetSet.hasNext()) {
runTests(argSetSet.next()); //saves output to file
}
这会导致内存不足错误。但是我不会将argsetset.next()的结果保存到任何地方,所以为什么会发生这种情况?我不需要存储来自 next()
或者 runTests()
. 我怎样才能确保所有的东西都被垃圾收集起来?
如果我发表评论 runTests()
,运行良好。
5条答案
按热度按时间cidc1ykv1#
[clippy like icon]看起来您正在计算一个非常大的集的powerset。是否要增加堆大小?
我担心的是你说这是一个懒惰列表,这意味着整个powerset实际上不在内存中,但是当你调用.next()时,它只有一部分在内存中。但是,根据.next()实际返回的内容(数组大小),默认堆大小很可能不够。
您可以通过指定-
Xmx1024m
(将堆的最大值大小设置为1gb)。显然,您可以调整这个大小,但这将允许您测试它是否可以扩展。这不是一个最终解决方案,但它至少应该给你一些跑道。b1payxdu2#
没有足够的代码来理解发生了什么,主要是powerset,但是powerset必须计算字符串数组才能返回下一个方法。可能是它抓住了那个物体。
内存问题在runtests方法或powerset类中。你贴的代码里没有。
zxlwwiss3#
什么在基地?我猜那会占用很多内存。当powerset在内部使用baseset时,这种情况可能会加剧。
kgqe7b3p4#
附加一个像jvisualvm这样的探查器,调查你的记忆去了哪里。你可能会惊讶:)
6jygbczu5#
您没有存储
.next()
任何地方都不相关,相关的是什么.next()
实际上是在做。是否将堆大小设置为非默认大小?您使用什么设置来启动jvm?jvm的默认堆大小只有64m,因此一万亿个条目肯定不能放入这个空间。