垃圾回收GC

垃圾回收GC

追踪所有正在被使用的对象,将不被使用的标记为垃圾。

手动管理

用malloc和free 或者 new / delete手动回收

智能指针

基于引用计数,比如c++里面的智能指针,当引用计数为0时,回收该对象

自动内存管理

1. 引用计数法

可能会出现,互相引用 无法回收。c++中可用weak_ptr 弱引用

2. 可达性分析算法

依赖于gc root对象。

可以充当gc root 对象的

  • 虚拟机栈中引用的对象
  • 方法区中静态属性引用的对象
  • 方法区中常量所引用的对象
  • 本地方法栈中JNI引用的对象

从gc root对象出发 联通的称之为 存活对象
不联通的称之为垃圾

java中的引用

在jdk1.2之后,java对引用进行了扩充
强引用: 被强引用关联对象 永远不会被垃圾回收
软引用:当内存要溢出是就会去回收
弱引用:只要发生垃圾回收,就会被回收
虚引用:在发生垃圾回收的时候,会收到一个通知

至此,可以确定哪些垃圾可以被回收了

常用的垃圾收集算法
1. 标记并清除

标记出来垃圾后,清理掉
缺点:会产生大量内存碎片

2. 复制算法

在上一个算法的基础上演化而来的,解决了内存碎片的问题
将内存分为两块,在一块被用完之后,将还活着的对象移到一个空闲的块上去,清楚以前那一块。
这样就解决了内存碎片的问题。

新的问题:内存折半,没法发挥内存最大作用

3. 标记整理算法

从1中演化而来,将活动的对象,移动到一端,然后清除另一端
问题:效率问题,对内存变动更频繁,需要整理所有存活对象的引用地址,效率上比2差很多。

4. 分代收集算法 🌟

一套组合拳

根据对象存活周期的不同,它分为新生代老年代

新生代:每次垃圾回收时都会有大批对象死去,少量存活。所以采用2算法
老年代:存活对象比例高,所以使用1 / 3算法来进行回收

https://www.bilibili.com/video/BV1by4y127eD
https://space.bilibili.com/59546029/video?keyword=垃圾回收
https://www.cnblogs.com/zackstang/p/10034699.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值