java中堆和栈的区别

在Java中,堆与栈都是内存中存放数据的地方。变量分为基本数据类型和引用类型,基本数据类型的变量(int、short、long、byte、float、double、boolea、char等)以及对象的引用,其内存都分配在栈上,变量除了作用域就会自动释放,而引用类型的变量,其内存分配在堆上或者常量池(例如字符串常量和基本数据类型常量)中,需要通过new等方式进行创建。

栈内存的管理是通过压栈和弹栈操作来完成的,以栈帧为基本单位来管理程序的调用关系,每当由函数调用时,都会通过压栈方式创建新的栈帧,每当函数调用结束后都会通过弹栈的方式释放栈帧。

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

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

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

你可能感兴趣的:(java中堆和栈的区别)