2020-11-16

栈与堆的一些理解

当程序创建一个变量或对象的引用时,视为在栈内存中开辟一个新得空间,用来存储这些数据。
java栈的区域很小,大约2m左右,特点是存取的速度特别快。

栈存储的特点是先进后出。
这相当于一个子弹夹,当往里装子弹后,先装进去的没有那个快被使用,而是最后装进去的最先使用。

存储速度快的原因:
栈内存, 通过 ‘栈指针’ 来创建空间与释放空间 !
指针向下移动, 会创建新的内存, 向上移动, 会释放这些内存 !
这里可以想象一下填装子弹的过程。
(个人理解:刚开始标记的是子弹夹的入口,后来每装进一枚子弹,弹夹指针就往下移动进行标记。)

这种方式速度特别快 , 仅次于PC寄存器 !
但是这种移动的方式, 必须要明确移动的大小与范围 ,
明确大小与范围是为了方便指针的移动 , 这是一个对于数据存储的限制, 存储的数据大小是固定的 , 影响了程序
的灵活性 ~
所以我们把更大部分的数据 存储到了堆内存中

存储的是:
基本数据类型的数据 以及 引用数据类型的引用!
例如:

int a =10;
Person p = new Person();

10存储在栈内存中 , 第二句代码创建的对象的引用p存在栈内存中

堆存放的是类的对象
Java是一个纯面向对象语言, 限制了对象的创建方式:
所有类的对象都是通过new关键字创建
new关键字, 是指告诉JVM , 需要明确的去创建一个新的对象 , 去开辟一块新的堆内存空间:
堆内存与栈内存不同, 优点在于我们创建对象时 , 不必关注堆内存中需要开辟多少存储空间 , 也不需要关注内存占用
时长 !
堆内存中内存的释放是由GC(垃圾回收器)完成的
垃圾回收器 回收堆内存的规则:
当栈内存中不存在此对象的引用时,则视其为垃圾 , 等待垃圾回收器回收 !

Person p0 = new Person();
Person p1 = new Person();
Person p1 = p0;

个人理解:
当堆内存创建两个个Person类对象后,对象的引用p0和p1分别指向了创建的对象的地址(假如用0x1234和0x1235表示,十六进制)。当对象p0的地址被重新赋给了p1的引用后,p0对象则没有指向内存而被GC释放。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值