Java 带有DFS的OutOfMemoryError

Java 带有DFS的OutOfMemoryError,java,optimization,refactoring,Java,Optimization,Refactoring,所以我陷入了困境。当我第一次创建DFS算法时,我使用了递归。这导致出现StackOverflow错误。好。。。没什么大不了的,我只是把它转换成迭代。因此,我将代码转换为迭代,并使用堆栈复制方法调用。然而,现在我摆脱了记忆错误 实际上我刚刚发现我的问题,有一个循环依赖。(愚蠢的我)然而,我很好奇如果没有循环依赖,其他人会如何处理这个问题。我还应该提到这是用Java编写的 我的问题是,当您知道自己没有无限循环,但由于DFS搜索的堆栈而遇到OutOfMemory错误时,应该怎么做。堆栈溢出就是它所说的

所以我陷入了困境。当我第一次创建DFS算法时,我使用了递归。这导致出现StackOverflow错误。好。。。没什么大不了的,我只是把它转换成迭代。因此,我将代码转换为迭代,并使用堆栈复制方法调用。然而,现在我摆脱了记忆错误

实际上我刚刚发现我的问题,有一个循环依赖。(愚蠢的我)然而,我很好奇如果没有循环依赖,其他人会如何处理这个问题。我还应该提到这是用Java编写的


我的问题是,当您知道自己没有无限循环,但由于DFS搜索的堆栈而遇到OutOfMemory错误时,应该怎么做。

堆栈溢出就是它所说的,因为您有一个递归算法,这意味着您的内存堆栈(用于函数调用)已经溢出。查看调用堆栈文档,了解堆栈指针、帧和返回指针的工作原理:

创建iTreative算法时,内存不足,因为存储的变量不在调用堆栈上,而是存储在函数本身的内存中(在同一堆栈框架内)

当然,从技术上来说,这两个错误都意味着你没有记忆了,但它们都是以不同的方式发生的。一种是通过对方法的无终止递归调用,另一种是通过溢出内存

编辑
关于您编辑过的问题,我认为如果没有无限循环或递归,堆栈溢出不会发生,除非您的系统中没有足够的内存。可能会添加更多RAM?

堆栈溢出和内存不足错误的常见原因是程序使用需要O(n)个(或更多)存储空间的算法,最好的做法是找到一种使用更少存储空间的算法或技巧,如O(1)或O(logn)。最常见的例子是在固定大小的块中处理大文件,即使用O(1)存储,而不是首先将其全部读入内存,即O(n)

这些错误的另一个常见原因是简单的错误:积累不再需要的垃圾,或者在算法需要重用现有对象时创建新对象。同样在这种情况下,合适的解决方案是定位bug并修复它


只有当您确定算法尽可能地保持内存保守,并且没有内存错误时,才有必要使用JVM内存参数(
-Xss
设置堆栈大小,
-Xms
-Xmx
设置初始和最大堆大小)

在几乎所有情况下,如果遇到与内存相关的异常,首先要做的是对自己正在做的事情进行长期而艰苦的思考(可能需要内存分析器的帮助)。您很有可能保留不再需要的数据

也就是说,如果您确信您的程序运行高效,并且您的问题仅仅是由于数据集的大小和/或复杂性造成的,那么您可以增加应用程序使用的堆栈或堆:

-Xss64m
将堆栈大小设置为64兆

-Xmx1024m

将堆大小设置为1 gig。

谢谢,让我来解决我的问题。对,我删除了递归部分,因为它不符合我的问题。(这是我最初问题的一部分)你能描述一下你试图搜索/解决的问题类型吗?对我来说,DFS似乎不适合您试图解决的问题类型。解决方案可能位于您永远无法到达的分支上,因为DFS卡在其中一个没有希望的分支中。但即使这样也不太可能,可能您只是分配和保留了太多内存。