java堆和栈

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

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

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

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

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

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

堆和栈的存储如下例所示:

 

[java] view plain copy

  1. class Rectangle{  
  2. private int width;  
  3. private int length;  
  4. public Rectangle(int width, int length){  
  5. this.width = width;  
  6. this.length = length;  
  7. }  
  8. }  
  9. public class Test{  
  10. public static void main(String [] args){  
  11. int i = 1;  
  12. Rectangle r = new Rectangle(3,5);  
  13. }  
  14. }  

 

 

 

在上述程序进入main方法后,数据的存储关系如图所示:

由于i为基本数据类型的局部变量,因此它存储在栈空间中,而r为对象的引用变量,因此也被存储在栈空间中;实际的对象存储在堆空间中,当main方法退出后,存储在栈中的i和r通过压栈和弹栈操作将会在栈中被回收,而存储在堆中的对象将会由垃圾回收器来自动回收。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值