漫画:JVM 灵魂拷问“你是什么垃圾?”

640?wx_fmt=gif

作者 | iMononoke

本文经授权转载自码个蛋(ID:codeegg)

640?wx_fmt=jpeg

640?wx_fmt=jpeg


640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg


640?wx_fmt=png

GC是啥?


GC是一种自动的存储管理机制。当一些被占用的内存不再需要时,就应该予以释放。这种存储资源管理,称为垃圾回收。

就和平时你清理桌面,整理东西一样,很多人都见过听过一个理念“断舍离”吧,不会使用到的物品可以捐赠给其他人或者作为可回收物品被回收掉,很多时候我们存着一些物品,但是好几年都没有用到它们,只是想着可能什么时候会用到,这样一直占据着现实的“内存”。

640?wx_fmt=jpeg

640?wx_fmt=jpeg


640?wx_fmt=png

还“活着”吗?


在0-1的世界里,所谓“垃圾回收”,就是指收回那些不可能再被任何途径使用的对象所占的内存空间,释放了这些内存可以给需要的对象使用。

那么JVM里是怎么来分的?或者说哪些对象是需要被回收的?

主要是问一句:还“活着”吗?

要回收,先要判断是不是可以回收,就是这个对象还“活着”吗?

主要有两种算法来判断:

  • 引用计数法

  • 可达性分析法。

列个表看看~

640?wx_fmt=png

  • 引用计数法
最大的问题,是很难解决对象之间互相引用的情况。

一图胜千言。

  • 1 互相引用

640?wx_fmt=other

这是两个对象互相引用的情况,除此之外,这两个对象再无引用,但因为它们的引用计数不为0,所以引用计数器无法通知GC收集器回收它们。

  • 2 循环引用

640?wx_fmt=other

这是循环引用的情况,没有外部引用指向它们,但它们的引用计数不为0,就无法进行回收了。

640?wx_fmt=jpeg

比如一把椅子的靠背坏了,椅子的轮子还是好的,但这轮子不能拆下来挪为他用,所以椅子的靠背和它的轮子是互相引用的,但是除了它们自己,没有外界引用它们了。

这样的情况用“引用计数法”来判断的话,它们还是不用被回收的,但实际它们都没有使用作用了。

所以主流的JVM都不使用引用计数法来管理内存,而是采用下面的可达性分析法,下图是它的基本思路示意图。

  • 可达性分析法


640?wx_fmt=other

由图可知,object5、object6和object7都没有到GCRoots对象的引用链,它们都会被回收。

按照上面的例子,坏了的椅背和没坏的轮子都属于椅子对象(object5),但是椅子本身不被使用,就没有引用到它们的引用链了。

640?wx_fmt=other

640?wx_fmt=jpeg

640?wx_fmt=jpeg


640?wx_fmt=png

可以做GC Roots的对象


这个大图是不是挺熟悉?

640?wx_fmt=other

再归个类~

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

  • 第一次:对象可达性分析之后,发现没有与GCRoots相连接,此时会被第一次标记并筛选。

  • 第二次:对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过,此时会被认定为没必要执行。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

作者简介:公众号码个蛋,码上养成好习惯。

640?wx_fmt=png

9.5-7日 AI 开发大会(AI ProCon),7位出品人集结国内外60+技术大咖,探秘9大核心技术,深剖行业痛点,亚马逊首席科学家李沐还将亲授「深度学习集训营」,助力开发者实现技术跃迁。

640?wx_fmt=jpeg

 热 文 推 荐 

☞《乐队的夏天》很酷?程序员式的摇滚才燃爆了!

☞ 内含福利 | 世界人工智能大会:对话大咖,深挖机器学习的商业应用

☞ 为什么华为 200 万招聘 AI 博士,马斯克却推出脑机接口对抗 AI?

☞Chrome 为何会成功?

比特币勒索出新招,佳能单反被黑客攻破,白帽却利用一个漏洞赎回了照片,这波操作简直了……

从ACM班、百度到亚马逊,深度学习大牛李沐的开挂人生

糟了,上网记录被 Python 扒下来了!

Kubernetes要成为一个企业友好平台,到底还缺啥?

边看边用!这本 Python 3.6 的书火爆了 IT 圈!

 
 

640?wx_fmt=png

你点的每个“在看”,我都认真当成了喜欢

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值