有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带有DFS的java OutOfMemoryError

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

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

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


共 (2) 个答案

  1. # 1 楼答案

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

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

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

    编辑 关于你编辑的问题,我认为如果没有无限循环或递归,堆栈溢出不会发生,除非你的系统内存不足。也许再加一点内存

  2. # 2 楼答案

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

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

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