Java的栈溢出,都是由于递归调用引发的,而Java的数组越界了,引发的out of boundary一类的异常, 如果你的对象new得过多了,那就是Out of Memory了。 JVM虚拟机能用多少堆内存,也得看硬件什么配置了。至于栈内存,大小无所谓了,反正再大也不过10MB,小了也得1-2MB。但是你程序的递归调用不对,100MB也不够玩的。
StackOverflowError 栈空间不足,JVM中,方法的执行用栈,当分配的占空间不足时,比如无限递归调用,就会出现这个错误(某也就遇到过无限递归调用时出现过栈空间问题)OutOfMemoryError 堆空间不足,(忽略GC),堆是用来分配对象的地方,简单地说,new一个新的对象就发生在堆上,一般JVM的堆大小是可以设置的,默认好像是64M。如果你拼命new对象很快就会看到这个错误的。举个例子: static int callMyself(){ return callMyself(); } 运行这个方法,你会得到: Exception in thread "main" java.lang.StackOverflowError int[] a = new int[123456789]; 运行时会出现: Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
补充一点:堆和栈的大小是可以设置的,CMD下java -Xms 、java -Xmx、java -Xss -Xms<size> set initial Java heap size -Xmx<size> set maximum Java heap size -Xss<size> set java thread stack size
如果你的对象new得过多了,那就是Out of Memory了。
JVM虚拟机能用多少堆内存,也得看硬件什么配置了。至于栈内存,大小无所谓了,反正再大也不过10MB,小了也得1-2MB。但是你程序的递归调用不对,100MB也不够玩的。
static int callMyself(){
return callMyself();
}
运行这个方法,你会得到:
Exception in thread "main" java.lang.StackOverflowError int[] a = new int[123456789];
运行时会出现:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
-Xmx<size> set maximum Java heap size
-Xss<size> set java thread stack size