java中堆和栈有什么区别

来源:互联网 发布:图片文字编辑器软件 编辑:程序博客网 时间:2024/05/22 12:17

     1) 在java中,堆和栈都是内存中存放数据的地方。变量分为基本数据类型和引用类型,基本数据类型的变量(例如 int  ,short, long, byte, char , boolean, float, double )以及对象的引用变量,其内存都分配在栈上,变量出了作用域就会释放,而引用类型的变量,其内存分配在栈上或常量池中(例如字符串常量和基本数据类型常量),需要经过new 等方式创立;


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


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


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


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


    6)从堆和栈的功能及作用来比较,堆主要是用来存放对象的,栈主要是用来执行程序的,相比较于堆,栈的存取速度更快,但栈的大小和生存期必须是确定的,因此缺乏一定的灵活性。而堆却可以在运行时动态的分配内存,生存期不用提前告诉编译器,但这也导致了其存取速度的缓慢。

   


1 0
原创粉丝点击