java中堆和栈内存的区别

在java中,堆和栈都是内存中存放数据的地方。变量分成基本数据类型和引用类型,基本数据类型的变量(例如 int、long、byte、float、double、boolean、char)已经对象的引用变量,其内存都分配在栈上,变量出了作用域就会自动释放。而引用类型的变量,其内存分配在堆上或者常量池(例如字符串常量和基本数据类型常量)中,需要通过new等方式进行常见。

栈内存

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

堆内存

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


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

猜你喜欢

转载自blog.csdn.net/Reoger/article/details/72802096