java:垃圾收集

vnjpjtjt  于 2021-06-30  发布在  Java
关注(0)|答案(5)|浏览(407)

我有个内存不足的错误。我有一个大范围的输入(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() ,运行良好。

cidc1ykv

cidc1ykv1#

[clippy like icon]看起来您正在计算一个非常大的集的powerset。是否要增加堆大小?
我担心的是你说这是一个懒惰列表,这意味着整个powerset实际上不在内存中,但是当你调用.next()时,它只有一部分在内存中。但是,根据.next()实际返回的内容(数组大小),默认堆大小很可能不够。
您可以通过指定- Xmx1024m (将堆的最大值大小设置为1gb)。显然,您可以调整这个大小,但这将允许您测试它是否可以扩展。这不是一个最终解决方案,但它至少应该给你一些跑道。

b1payxdu

b1payxdu2#

没有足够的代码来理解发生了什么,主要是powerset,但是powerset必须计算字符串数组才能返回下一个方法。可能是它抓住了那个物体。
内存问题在runtests方法或powerset类中。你贴的代码里没有。

zxlwwiss

zxlwwiss3#

什么在基地?我猜那会占用很多内存。当powerset在内部使用baseset时,这种情况可能会加剧。

kgqe7b3p

kgqe7b3p4#

附加一个像jvisualvm这样的探查器,调查你的记忆去了哪里。你可能会惊讶:)

6jygbczu

6jygbczu5#

您没有存储 .next() 任何地方都不相关,相关的是什么 .next() 实际上是在做。
是否将堆大小设置为非默认大小?您使用什么设置来启动jvm?jvm的默认堆大小只有64m,因此一万亿个条目肯定不能放入这个空间。

相关问题