JAVA中堆(heap)和栈(stack)的区别

在学习JVM的内存模型的时候,堆(heap)和栈(stack)是JVM的内存区域中的重要组成部分

堆(Heap)

所有的应用可以从一个系统共有的空间中申请供自己使用的内存,这个共用的空间就叫做Heap;建立对象时,在Heap中的内存实际建立这个对象,而对象实例在Heap中分配好以后,需要在Stack中保存一个4字节的Heap内存地址,用来定位该对象实例在Heap中的位置,便于找到该对象实例

 

栈(Stack)

每个应用程序用于存放临时变量参数传递函数调用时的值的保存的内存空间,就叫Stack;在建立对象时,Stack中分配的内存只是指向这个对象的指针(引用)而已

eg:String str1 = new String("abc");   (1)

        String str2 = "abc";                    (2)

         System.out.println(str1 == str2);      \\false    (3)

str1是在Heap中创建对象,Stack中存的是str1在heap中的内存地址;

str2是指向Stack里面值为“abc”的引用变量,语句(2)的执行,首先会创建引用变量str2,再查找Stack中有没有“abc”,有则将str2指向“abc”,没有则在Stack中创建一个“abc”,再将str2指向“abc”

(3)中创建了两个引用,创建了两个对象,两个引用指向不同的对象,所以结果为false

 

 堆(Heap)和栈(Stack)的区别

1.系统区别

Stack的空间很小,存取速度仅次于寄存器,存储效率比Heap高空间有限,Stack中的数据可以共享,但是存储在Stack中的数据大小和生存期必须是确定的,缺乏灵活性

Heap的空间是很大的自由区,存取速度较慢,可以动态的分配内存大小

2.存储时间

Stack的空间是由操作系统自动分配和释放,不存在内存回收问题

Heap是随机分配内存,不定长度,存在内存分配和回收问题;因为JVM的GC进程会定期扫描Heap,它根据Stack中保存的4字节对象地址扫描Heap,定位Heap中的这些对象,进行一些优化(例如合并空闲内存块),并且假设Heap中没有扫描到的区域都是空闲的,统统refresh(实际上操作是把Heap中丢失了对象地址的无用对象清除了),这就是垃圾清理的过程

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值