浅谈堆内存和栈内存

区别

栈(Stack)堆(Heap)
用途用于执行方法,存放局部变量、对象的引用、数组的引用用于存放对象和数组
速度运行时会计算该方法需要分配多少内存空间,且遵循先进后出的压栈规则,因此灵活性低,但速度更快空闲空间更大,运行时内存空间可随时申请或回收,因此灵活性高,但速度更慢
唯一性每个Java线程都有一个栈一个Java进程只有一个堆

举例

//基本变量
int a = 1;
//数组
int[] i = new int[]{1, 2, 3};
//对象
Person a = new Person();
a.name = "小明";
a.age = 10;
//引用传递
Person b = a;

在单一线程中执行以上函数,实际内存空间是这个样子:
在这里插入图片描述
可以看到栈内存只存放了局部变量,对于数组和对象,栈内存只持有引用,实际的值在堆内存里。

理解

  • 栈内存(Stack):每个线程都有独立的栈,它结构紧凑,不灵活但是速度更快,并且Stack只有跟程序有关才翻译成“栈”,一般翻译成“一叠”或者“一摞”。因此它就像课桌上的一摞书,你(Thread1)的课桌上有,同桌(Thread2)的课桌上也有,叠成一摞之后放和拿都很快。
  • 堆内存(Heap):空间由整个进程共享,它结构自由,空间更大,但速度更慢。所以它就像学校的杂物间,大得可以放下全校同学(整个进程)的物品,从里面找东西会比从一摞书中找书更慢,还不时会有保洁阿姨(gc)去清理垃圾。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值