Java 递归与内存

Java 递归与内存,java,memory-management,recursion,Java,Memory Management,Recursion,我有一个程序,通过递归传递大量数据,比如1000个变量。递归将至少运行50或60次。我担心的是,是否有可能因为没有太多空间而在内存位置上过度写入数据,或者如果没有内存,我会得到一些异常,程序内存已经用完(我没有收到这样的错误) 由于程序没有更多内存并且在现有位置上写得过多,是否有可能得到错误的解决方案?不可能得到错误的结果:在堆栈溢出的情况下,您的程序将提前终止,并出现一个错误 存储数据的内存位置不能被其他任何内容覆盖。Java,甚至对于C,程序内存永远不会改变不相关内存的状态 尽管JVM不支持

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


由于程序没有更多内存并且在现有位置上写得过多,是否有可能得到错误的解决方案?

不可能得到错误的结果:在堆栈溢出的情况下,您的程序将提前终止,并出现一个错误


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

Java,甚至对于C,程序内存永远不会改变不相关内存的状态


尽管JVM不支持尾部递归。因此,在没有更多可用空间的情况下,您将获得最大值。您不应该担心数据损坏,而是应该看看递归堆栈是否太高(比如2000以上)。如果是这样的话,就去做吧

可能有两种情况

  • 足够的内存,递归完成,您将得到result

  • 内存不足,导致堆栈溢出错误和程序退出

  • 您不会因为没有发生内存覆盖而产生错误的结果

    是否有可能在内存中过度写入数据 因为没有太多的空间

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

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


    如果JVM耗尽了内存,您将得到一个(),但这里唯一的例外是,如果递归函数多次调用自身,则会得到一个()。堆栈是保存方法调用的当前状态(即局部变量和引用)的地方,堆是存储对象的地方。表示在Linux 64位上,默认情况下每个线程都有一个1024kB的堆栈。堆可以任意变大,今天它的大小顺序是GB

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

    public void stackOverflow() {
      int a_1;
      int a_2;
      int a_3;
      // ...
      int a_10_000_000;
    }
    
    您的程序将因堆栈溢出错误而崩溃。另一方面,如果在数组中组织整数,如:

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

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

    您可能会遇到一些例外情况,即程序内存已耗尽如果您的计算机上的物理内存不足,而JVM空间不足,它可能运行得非常慢,但你仍然不会得到任何错误的答案。准确地说,这是一个“StackOverflower错误”,而不是一个例外。错误和异常是不一样的!“错误是Throwable的一个子类,表示合理的应用程序不应试图捕捉的严重问题。大多数此类错误都是异常情况。”这是一个打字错误。更正。谢谢,在每一个递归中,如果我创建变量的副本,仍然不会有过度写入?覆盖没有,但是如何传递变量?您确定要创建、传递或复制吗?你说复制是什么意思?我是说深度复制。。但是,是的,我在代码中发现了这个bug。。感谢您的帮助局部变量声明会占用内存吗?任务完成后不是吗?