垃圾回收

https://blog.csdn.net/weixin_39067991/article/details/81045201(很全)

垃圾回收:

函数中new了对象,对象存在堆里,函数不用了,对象不用了,怎么回收?

早期策略:引用计数,判断每个对象被引用的个数
如 A a1=new A()
A a2 = new A()
A a3= a1;
计数3,函数结束后,a1,a2,a3销毁,计数-1,计数到0的时候,回收
引用计数会碰到循环引用的问题,循环引用的对象就无法回收了
优点:快,夹杂在程序的运行之中的
缺点:无法回收循环引用的对象

现在的策略:跟踪收集器(Tracing collector)
把所有引用对象当做一个数,或者是图
从这个树的根节点(GC root)出发, 找出所有连接的树的结点(从堆外到堆内)
这些可以连接的对象,就是可达的,存活对象
不可达对象,垃圾
做一段时间,就停下来,走一遍

怎么回收垃圾
1.标记-清理
标记了所有存活对象,和垃圾对象
然后再遍历一遍,删除所有垃圾所占空间
简单方便-块-但会产生空间碎片

2.标记-整理
在标记了所有存活对象的时候
把这些对象统一放到一个地方
就没有内存碎片了
实质上就是主动进行碎片整理

3.复制
直接把堆拆成两部分
一段时间只用一部分
在垃圾回收时候,把存活对象复制到另一部分的堆空间上
然后当前内存直接清空

分代收集算法
就是根据对象存活周期的不同
把内存分为几块,不同区域采用不同垃圾回收算法

Java的堆空间分为2大部分
1.新生代
存活时间少,存活对象少,垃圾多
2.老年代
存活时间长,存活对象到,垃圾少

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值