java内存溢出,到底是堆溢出还是栈溢出。虚拟机到底能用多少内存。
请给出有力证据。

解决方案 »

  1.   

    StackOverflowError vs OutOfMemoryError
      

  2.   

    Java的栈溢出,都是由于递归调用引发的,而Java的数组越界了,引发的out of boundary一类的异常,
    如果你的对象new得过多了,那就是Out of Memory了。
    JVM虚拟机能用多少堆内存,也得看硬件什么配置了。至于栈内存,大小无所谓了,反正再大也不过10MB,小了也得1-2MB。但是你程序的递归调用不对,100MB也不够玩的。
      

  3.   

    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
      

  4.   

    补充一点:堆和栈的大小是可以设置的,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