【问题标题】:recursion and memory递归和记忆
【发布时间】:2012-11-12 18:00:04
【问题描述】:

我有一个程序通过递归传递大量数据,比如 1000 个变量。递归将运行至少 50 或 60 次。我担心的是,是否有可能因为没有太多空间而在内存位置上覆盖数据,或者如果没有内存,我会得到程序内存的一些异常已用完(我没有收到此类错误)?

是否有可能因为程序没有更多内存并且在现有位置上覆盖而得到错误的解决方案?

【问题讨论】:

  • 你会得到一些程序内存已用完的异常
  • 如果您的计算机上的物理内存已用完,而 JVM 空间却没有用完,它的运行速度可能会非常慢,但您仍然不会得到任何错误的答案。

标签: java memory-management recursion


【解决方案1】:

涉及两个存储区域:stack 和堆。堆栈是保存方法调用的当前状态的地方(即局部变量和引用),而堆是存储对象的地方。 The Hotspot documentation 表示在 64 位 Linux 上,默认情况下每个线程都有一个 1024kB 的堆栈。堆可以任意大,现在是 GB 级。

递归方法同时使用堆栈和堆。您首先用完哪个取决于实施。例如,考虑一个需要数千个整数的方法:如果它们被声明为局部变量,即:

public void stackOverflow() {
  int a_1;
  int a_2;
  int a_3;
  // ...
  int a_10_000_000;
}

您的程序将使用StackOverflowError 崩溃。另一方面,如果您将整数组织在一个数组中,例如:

public void outOfMemory() {
  int[] integers = new int[10 * 1000 * 1000];
} 

堆很快就会被填满,程序将以OutOfMemoryError结束。在这两种情况下,内存都已损坏或数据被覆盖。但是,在这两种情况下,代码都是错误,必须以某种方式修复 - 但是为了告诉您如何我们需要了解更多关于您的程序的信息。

【讨论】:

  • 声明局部变量会消耗内存?不是任务完成后吗?
【解决方案2】:

内存中的数据是否有可能被覆盖 位置,因为没有太多空间

Java 将对象存储在堆空间中,这些值仅由垃圾收集器回收。这意味着您传递的是引用而不是函数的值,这不会消耗内存,因为您没有复制变量(但通过增加堆栈帧来增加内存)。如果您的对象在线程堆栈中被引用,那么它就不会被覆盖。

[...]或者如果没有记忆,我会得到一些 程序内存用完的异常

如果 JVM 耗尽其内存,您将获得 Asynchronous exception (OutOfMemoryError),但这里唯一的例外是如果您的递归函数大量调用自身,您将获得 StackOverflowError

【讨论】:

  • 并且在每个递归中,如果我正在创建变量的副本,仍然不会覆盖?
  • 覆盖不,但是你是如何传递你的变量的?你确定你是在创造、传递还是复制?抄袭是什么意思?
  • 我的意思是深拷贝 .. 但是是的,我发现了我的代码中的错误.. 感谢您的所有帮助
【解决方案3】:

不可能得到错误的结果:如果发生 stackoverflow,您的程序将提前终止并返回 StackOverflowError

您存储数据的内存位置不能被其他任何东西覆盖。

【讨论】:

    【解决方案4】:

    Java 甚至 C,你的程序内存永远不会改变无关内存的状态。

    虽然 JVM 不支持尾递归。因此,当没有更多可用空间时,您最多会得到StackOverFlowError。你不应该担心数据损坏,而是看看递归堆栈是否太高(比如高于 2000)。如果是这样,请继续努力

    【讨论】:

    • 准确来说是“StackOverflowError”,不是异常。错误和异常是不一样的! “错误是 Throwable 的子类,表示合理的应用程序不应尝试捕获的严重问题。大多数此类错误是异常情况”
    • 打错字了。已更正。谢谢
    【解决方案5】:

    可能有两种情况

    1. 足够的内存,递归完成,你得到结果。

    2. 内存不足,导致 StackOverFlowError 和程序退出

    你不会因为没有发生内存覆盖而得到错误的结果

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-27
      • 1970-01-01
      • 2011-03-28
      • 1970-01-01
      • 2018-09-08
      • 2015-05-03
      • 1970-01-01
      • 2020-12-04
      相关资源
      最近更新 更多