
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
Java编程开发是目前大多数人转型互联网行业都会去学习的一个编程开发语言,而本文我们就通过案例分析来简单了解一下,Java编程堆和栈的区别。
一、Java堆
(1)Java堆是JVM所管理的大的一块内存。它是被所有线程共享的一块内存区域,在虚拟机启动时创建。
(2)几乎所有的实例对象都是在这块区域中存放。(JIT编译器貌似不是这样的)。
(3)Java堆是垃圾收集管理的主要战场。所有Java堆可以细分为:新生代和老年代。再细致分就是把新生代分为:Eden空间、FromSurvivor空间、ToSurvivor空间。JVM具体的垃圾回收机制总结请查看我的另外一篇JVM——内存管理和垃圾回收。
(4)根据Java虚拟机规范的规定,Java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可。
如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常。
二、堆和栈的区别
这是一个非常常见的面试题,主要从以下几个方面来回答。
(1)各司其职
主要的区别就是栈内存用来存储局部变量和方法调用信息。
而堆内存用来存储Java中的对象。无论是成员变量、局部变量还是类变量,它们指向的对象都存储在堆内存中。
(2)空间大小
栈的内存要远远小于堆内存,如果你使用递归的话,那么你的栈很快就会充满并产生StackOverFlowError。
关于如何设置堆栈内存的大小,可以查看JVM——内存管理和垃圾回收中的相关介绍。
(3)独有还是共享
栈内存归属于线程的私有内存,每个线程都会有一个栈内存,其存储的变量只能在其所属线程中可见。
而堆内存中的对象对所有线程可见,可以被所有线程访问。
(4)异常错误
如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常。
如果JVM栈可以动态扩展(大部分JVM是可以的),当扩展时无法申请到足够内存则抛出OutOfMemoryError异常。
而堆内存没有可用的空间存储生成的对象,JVM会抛出java.lang.OutOfMemoryError。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。