最主要的区别:
Java中所有由类实例化的对象(new)和数组都存放在堆内存中,无论是成员变量,局部变量,还是类变量,它们指向的对象都存储在堆内存中。
而栈内存用来存储局部变量和方法调用。
是否共享:
栈内存属于单个线程,,即对其他线程不可见(不共享);
而堆内存中的所有对象对所有线程可见,即堆内存中的对象可以被所有线程访问(共享)。
异常处理不一样:
如果栈内存没有可用的空间存储方法调用和局部变量,JVM会抛出java.lang.StackOverFlowError。
而如果是堆内存没有可用的空间存储生成的对象,JVM会抛出java.lang.OutOfMemoryError。
空间大小不一样:
栈的内存要远远小于堆内存;所以在使用递归时,需要注意递归结束条件,很可能还没结束,栈内存已经不足;
java中可以通过-Xss选项设置栈内存的大小。-Xms选项可以设置堆的开始时的大小,-Xmx选项可以设置堆的最大值来帮助解决问题;
栈内存的默认值大小: ThreadStackSize = 1024;
堆内存的默认值大小:InitialHeapSize := 134217728(初始化); MaxHeapSize := 2147483648 (最大值)
网友评论