什么是Java中的*Error?什么时候发生?
当太多的数据被放置在stack,这是一种有限的资源时,会发生堆栈溢出。
下面是一个例子:
public class Overflow {
public static final void main(String[] args) {
main(args);
}
}
这个函数调用自身多次与没有终止条件。因此,堆栈填满是因为每次调用都必须在堆栈上推送一个返回地址,但返回地址永远不会从堆栈弹出,因为该函数永远不会返回,它只会不断调用它自己。
通常当递归方法被调用的次数太多时。例如:
public void doSomething(int time)
{
System.out.println("do #" + (doSomething(time++)));
}
在Java中没有像*Exception
这样的东西。
有,然而,一个名为*Error
和the documentation类说:
时发生堆栈溢出,因为应用程序递归太深而引发。
如果你不知道堆栈是什么,这样说的:Call stack
每次调用一个函数,一小块特殊的内存区域 - 栈 - 被分配给它,并持有局部变量和函数的上下文。如果我们的函数调用另一个函数,那么下一个函数将被切断,等等。当函数再次返回时,堆栈会缩小。如果嵌套级别太高,可能会溢出。
这是一个非常普遍的概念。在Java上,超过堆栈大小时会引发*Error
。这是一个错误,而不是例外,因为你被要求避免这种情况,不能从中恢复。
典型的例子是无限递归:
public void foo(int i) {
return foo(i+1);
}
Java的机器分配程序的内存特定数量。错误是由程序使用太多内存引起的。上面的例子很好,但是如果你正在尝试创建一个非常大的数组,并且可能导致它溢出。 您可以通过使用命令行参数
java -Xmx200m YOUR_PROGRAM_CLASS
这将减少你得到一个*Exception的机会分配更多的内存(200MB的这个例子中)到你的程序。
This Explains the command line options
(http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/java.html#Xms)
-1:即使存在大量堆内存,*Error也会发生 – 2010-06-17 19:08:50
但是错误的根本原因仍然相同,内存太多。您可以通过增加堆大小或更改程序来更有效地使用内存来解决此问题。 – Lee 2010-06-17 21:52:16
给我力量.... – 2010-06-17 11:12:59
是谷歌坏了? – 2010-06-17 11:13:19
这个问题让我惊讶于代表114的代表。 – 2010-06-17 11:14:16