我有一个程序通过递归传递大量数据,比如 1000 个变量。递归将运行至少 50 或 60 次。我担心的是,是否有可能因为没有太多空间而在内存位置上覆盖数据,或者如果没有内存,我会得到一些异常,即程序内存已经用完了(我没有收到这样的错误)?
是否有可能因为程序没有更多内存并且覆盖现有位置而得到错误的解决方案?
最佳答案
涉及两个存储区:stack和堆。堆栈是保存方法调用的当前状态(即局部变量和引用)的地方,堆是存储对象的地方。 The Hotspot documentation说在 Linux 64 位上,每个线程默认都有 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
结束。在这两种情况下,内存都不会损坏或数据被覆盖。但是,在这两种情况下,代码都是错误,必须以某种方式修复 - 但要告诉您如何我们需要了解更多关于您的程序的信息。
关于java - 递归与内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13544862/