Flo*_*ose 7 java recursion memory-management
我有一个程序通过递归传递大量数据,比如1000个变量.递归将至少运行50或60次.我担心的是,是否存在数据被覆盖在内存位置上的可能性,因为没有太多空间,或者如果情况没有内存,我会得到程序内存的异常已经用完(我收到没有这样的错误)?
是否有可能得到错误的解决方案,因为该程序没有更多的内存并且在现有位置上覆盖?
Raf*_*ele 17
涉及两个存储区域:堆栈和堆.堆栈是保持方法调用的当前状态的位置(即局部变量和引用),堆是存储对象的位置.Hotspot文档说,在Linux 64位上,默认情况下每个线程的堆栈为1024kB.堆可以任意大,今天它是GB的顺序.
递归方法使用堆栈和堆.你首先用完哪一个取决于实现.作为一个例子,考虑一个需要数千个整数的方法:如果它们被声明为局部变量,即:
public void stackOverflow() {
int a_1;
int a_2;
int a_3;
// ...
int a_10_000_000;
}
Run Code Online (Sandbox Code Playgroud)
你的程序会崩溃StackOverflowError.另一方面,如果您在数组中组织整数,例如:
public void outOfMemory() {
int[] integers = new int[10 * 1000 * 1000];
}
Run Code Online (Sandbox Code Playgroud)
堆将很快填满,程序将以一个结束OutOfMemoryError.在这两种情况下,内存都已损坏或数据被覆盖.但是,在这两种情况下,代码都是错误的,必须以某种方式修复 - 但要告诉您我们如何需要了解有关您的程序的更多信息.
因为没有太多空间,数据是否有可能被覆盖在内存位置上
Java将对象存储在堆空间中,这些值仅由垃圾回收器回收.这意味着你传递的是引用而不是函数的值,它不会消耗内存,因为你没有复制变量(但是通过增加堆栈帧来增加内存).如果在线程堆栈中引用了对象,则无法覆盖它.
[...]或者如果情况没有内存,我会得到程序内存耗尽的异常
在JVM耗尽其内存的情况下,您将获得异步异常(OutOfMemoryError),但是如果您的递归函数自身调用了很多次,那么唯一的例外是StackOverflowError.
| 归档时间: |
|
| 查看次数: |
12334 次 |
| 最近记录: |