Java:垃圾收集

Java:垃圾收集,java,memory-management,garbage-collection,heap,Java,Memory Management,Garbage Collection,Heap,我有一个内存不足的错误。我有一个大范围的输入(2^40),这是太大了,一次举行。每个输入都是一个字符串[] 相反,我认为应该对每个输入运行测试程序,将结果写入文件,然后丢弃输入。最长输入的长度为42,因此这不是导致溢出的错误。我想我不懂垃圾收集 PowerSet就像一个惰性列表-在调用.next()之前不会计算结果。每个结果返回基集的一个子集。 baseSet是长度为40的字符串[]。 runTests对输入进行一些分析并将其写入文件 PowerSet argSetSet = powerset(

我有一个内存不足的错误。我有一个大范围的输入(2^40),这是太大了,一次举行。每个输入都是一个
字符串[]

相反,我认为应该对每个输入运行测试程序,将结果写入文件,然后丢弃输入。最长输入的
长度为42,因此这不是导致溢出的错误。我想我不懂垃圾收集

PowerSet
就像一个惰性列表-在调用
.next()
之前不会计算结果。每个结果返回
基集的一个子集。
baseSet
是长度为40的字符串[]。
runTests
对输入进行一些分析并将其写入文件

PowerSet argSetSet = powerset(baseSet); 
while (argSetSet.hasNext()) {
    runTests(argSetSet.next()); //saves output to file
}
这会导致内存不足错误。但是我没有将argSetSet.next()的结果保存到任何地方,那么为什么会发生这种情况呢?我不需要存储
next()
runTests()
中的任何数据。我怎样才能确保所有的东西都被垃圾收集


如果我注释掉
runTests()
,它运行得很好。

没有足够的代码来理解发生了什么,主要是PowerSet,但是PowerSet必须计算字符串数组才能返回下一个方法。可能是因为它抓住了那个物体


内存问题在runTests方法或PowerSet类中。它不在您发布的代码中。

没有足够的代码来理解发生了什么,主要是PowerSet,但是PowerSet必须计算字符串数组才能返回下一个方法。可能是因为它抓住了那个物体


内存问题在runTests方法或PowerSet类中。它不在您发布的代码中。

baseSet中有什么?我猜这会占用大量内存。当PowerSet在内部使用baseSet时,这种情况可能会加剧。

baseSet中有什么?我猜这会占用大量内存。当PowerSet在内部使用baseSet时,这种情况可能会加剧。

您没有存储
的结果。next()
任何地方都不相关,相关的是
。next()
实际上在做什么


是否将堆大小设置为非默认大小?您使用什么设置来启动JVM?JVM的默认堆大小只有64M,因此条目肯定无法放入该空间。

事实上,您没有存储
的结果。next()
任何地方都是不相关的,相关的是
。next()
实际上在做什么


是否将堆大小设置为非默认大小?您使用什么设置来启动JVM?JVM的默认堆大小只有64M,因此条目肯定无法放入该空间。

附加一个类似jvisualvm的探查器,并调查内存的去向。您可能会感到惊讶:)

附加一个像jvisualvm这样的探查器,并调查您的内存去向。您可能会感到惊讶:)

[Clippy-like-icon]您似乎正在计算一个非常大的集合的功率集。是否要增加堆大小

我担心的是,您说这是一个惰性列表,这意味着整个电源集实际上不在内存中,但在调用.next()时,只有一部分在内存中。但是,根据.next()实际返回的内容(数组大小),默认堆大小很可能不够

您可以通过指定-
Xmx1024m
(将堆的最大值大小设置为1gb)来增加堆的大小。显然,您可以调整该大小,但这将允许您测试它是否可以扩展。这不是一个完结的解决方案,但它至少应该给你一些跑道。

[Clippy-like-icon]看起来你正在计算一个非常大的集合的功率集。是否要增加堆大小

我担心的是,您说这是一个惰性列表,这意味着整个电源集实际上不在内存中,但在调用.next()时,只有一部分在内存中。但是,根据.next()实际返回的内容(数组大小),默认堆大小很可能不够


您可以通过指定-
Xmx1024m
(将堆的最大值大小设置为1gb)来增加堆的大小。显然,您可以调整该大小,但这将允许您测试它是否可以扩展。这不是一个完结的解决方案,但至少应该给您一些跑道。

确切的错误消息是什么?这是一个
OutOfMemoryError
,表示对象太多了吗?或者是一个
StackOverflowerError
,它表明存在递归错误?确切的错误消息是什么?这是一个
OutOfMemoryError
,表示对象太多了吗?或者一个
StackOverflowerError
,这表明存在递归错误?
next()
返回的数组的最大大小是40。好的,是的,这肯定是关闭的。我建议下载像yourkit(yourkit.com)这样的探查器,并试用他们的Java探查器。您可以看到内存所在的位置。从您的注释判断,您保留了runTests中内存中的数组或字符串值。不确定您是否要向我们公开该方法,但请查找您将其放在映射/列表/集中而不清除映射或使用静态集合的位置。
next()
返回的数组的最大大小为40。好的,是的,这绝对是禁用的。我建议下载像yourkit(yourkit.com)这样的探查器,并试用他们的Java探查器。您可以看到内存所在的位置。从您的注释判断,您保留了runTests中内存中的数组或字符串值。不确定您是否要向我们公开该方法,但请查找您将其放入map/list/set中但不清除map或使用静态集合的位置。