gzyueqian
13352868059

Java开发中堆和栈有什么区别?

更新时间: 2020-12-28 16:37:09来源: 粤嵌教育浏览量:5812

    Java是一门一直都很活跃在我们生活中的一门开发语言了,不管是多少年过去,也不管是有多少的开发语言的崛起都不能够代替的了java在程序员心中的地位,java涉及的范围是非常广泛的,而且在技术上也是比较成熟的,那么java开发中堆和栈有什么区别呢?

  堆和栈的区别:


  各司其职,主要的区别就是栈内存用来存储局部变量和方法调用。而堆内存用来存储Java中的对象。无论是成员变量,局部变量,还是类变量,它们指向的对象都存储在堆内存中。


  独有还是共享,栈内存归属于单个线程,每个线程都会有一个栈内存,其存储的变量只能在其所属线程中可见,即栈内存可以理解成线程的私有内存。而堆内存中的对象对所有线程可见。堆内存中的对象可以被所有线程访问。


  异常错误:如果栈内存没有可用的空间存储方法调用和局部变量,JVM会抛出而如果是堆内存没有可用的空间存储生成的对象,JVM会抛出java.lang.OutOfMemoryError。


  空间大小:栈的内存要远远小于堆内存,如果你使用递归的话,那么你的栈很快就会充满。如果递归没有及时跳出,很可能发生StackOverFlowError问题。你可以通过-Xss选项设置栈内存的大小。-Xms选项可以设置堆的开始时的大小,-Xmx选项可以设置堆的值。


  具体而言,栈内存主要用来存放基本数据类型与引用变量,栈内存的管理是通过压栈和弹栈操作来完成的,以栈帧为基本单位来管理程序的调用关系,每当有函数调用时,都会通过压栈方式创建新的栈帧,每当函数调用结束后都会通过弹栈的方式释放栈帧。


  堆内存用来存放运行时创建的对象,一般来讲,通过new关键字创建出来的对象都存放在堆内存中,由于JVM是基于堆栈的虚拟机,而每个java程序都运行在一个单独的jvm实列上,每一个实列对应一个堆,一个java程序内的多个线程也就运行在同一个jvm实列上,因此这些线程之间会共享堆内存,鉴于此,多线程在访问堆中的数据时需要对数据进行同步,


  在C++中,堆内存的管理都是由开发人员来负责的,也就是说,开发人员在堆中申请的内存,当不在使用时,必须由开发人员完成堆内存的释放工作,而在java语言中,这个内存释放的工作由垃圾回收器来负责执行,开发人员只需要申请所需的堆空间而不需要考虑释放的问题。


  在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象,这就是java中引用的用法。


  关于java开发中的堆和栈有什么区别粤嵌科技已经和大家说了,如果说你想要了解或者是学习更多关于java的知识的话那么粤嵌科技欢迎大家来我们公司的java培训班进行实地考察,也可以点击我们文章下面的获取试听资格按钮来获取我们的java课程免费试听资格,在试听中可以更加深入的了解粤嵌科技。

免费预约试听课