跟我一起学JVM(三)——垃圾收集,刻不容缓

​本节的内容是Java虚拟机的核心——垃圾收集算法与垃圾收集器。

现实生活中我们都要讲究垃圾分类,垃圾收集。计算机的内存空间就像现实生活中的储物室一样,存放杂物的同时需要定期清理,毕竟空间有限。那Java虚拟机在内存垃圾处理上面用到了哪些技术呢?让我们开始本章的学习。

第一章Java虚拟机内存结构中我们学习了程序计数器,虚拟机栈以及本地方法栈都是线程私有的,会伴随线程的结束而自动释放空间,但是Java堆和方法区就不是这样了,因为他们是线程共享的空间,而且很多对象是在程序运行过程中被创建的,所以这两块内存空间的垃圾清理就变得复杂了起来。为了让程序运行的效率提高,内存空间的利用率最大化,程序员们对于这两块内存空间的优化可以说是绞尽脑汁。经过几十年的发展,出现了一些非常优质的算法,但是算法优化的道路永远没有止境~

话不多说,先上脑图,该脑图增加了自动内存管理中的垃圾收集算法,垃圾收集器以及独立模块“对象”的相应内容。
在这里插入图片描述

(一)垃圾收集算法

说到垃圾回收,我们首先要做的是判断它是垃圾,这就需要一系列的垃圾收集算法帮助系统识别哪些类,哪些对象是可以回收掉的。

通过脑图我们发现判断一个对象或者类是否可以回收,只要他们与周边的联系消失(也就是所谓的“孤魂野鬼”了)那么就可以被回收了。找联系就像找路径,会用到算法里的树的遍历之类的算法知识。

比如在判断对象是否可以回收的“可达性分析算法”中常常把常量,静态属性等不容易变化和被回收的老对象作为树的根节点(GCRoots)然后从根节点出发寻路,找到与节点相连的对象,从而形成一棵对象树,凡是不在树上的对象则可以被认为是“脱离团队”了,那就可以进行回收。

分代收集算法:
新生代
复制算法
(目的是为了用额外空间换得更高的内存分配效率)。

老年代
1.标记清除算法
2.标记整理算法

说白了都是先标记是否为垃圾。因为标记后直接清除算法会让内存都不连续了,人们就想办法把内存碎片清除掉,于是发明了标记整理算法,可以提高内存使用的便捷性,毕竟连续空间的分配肯定是最快捷的方式。

对象的引用程度
强引用,软引用,弱引用,虚引用
将一个对象和其他对象之间的关系分为以上四种,更加细致,有利于虚拟机作出更好的回收决策。

强引用:在程序代码中普遍存在的,垃圾回收器永远不会回收掉的对象

软引用:描述一些还有用但并非必须的对象,在系统将要发生内存溢出异常时会将这些对象列入进回收范围内进行二次回收,如果该回收结束后依旧没有足够内存才会抛出内存溢出异常

弱引用:描述非必须对象的,强度低于软引用,该对象只能生存到下一次垃圾回收发生之前,当垃圾收集器工作时,无论当时内存是否足够,都会回收掉弱引用关联的对象

虚引用:幽灵引用或者幻影引用,是最弱的引用关系,无法通过虚引用获得一个对象实例,为对象设置虚引用唯一目的就是该对象回收时收到一个系统通知。

(二)垃圾收集器

因为垃圾收集过程相当于仓库管理员在清理库存的时候,那肯定是不希望在他清理的时依旧有进出货物的行为发生,因为他没有对新来的货物进行标记,也不知道这些货物是不是垃圾。同样的,对于系统来说,在执行垃圾回收时,要暂停所有的线程,也就是所谓的“Stop the world” 。为了避免一些线程出现执行了一部分的尴尬情况,执行GC时需要设置安全点或者安全区域,线程一旦到达安全点或者进入安全区域就可以进行GC,此时线程都要全部停止。可见垃圾清理虽然释放了内存空间,但是影响了用户体验和运行效率。

为了获得更好的用户体验,人们开始研发各种各样的垃圾回收器,从一开始的serial单线程的到CMS,G1多线程的 。脑图中提供了各式收集器,并不是多线程一定快于单线程,因为有时候开一个分支线程执行标记和回收都是占用了许多计算资源的,在一些情况下的单线程反而更加安全与便捷。具体问题具体分析,采用针对性的解决方式才是有意义的。

下一章就进入故障处理工具以及实际开发中的小例子,学了新东西总要拿出来溜溜才能明白学习的意义嘛 。

喜欢请三连~微信公众号对应博文封面图是前些日子去的纽约世贸中心,确实豪华啊!


Instagram: https://www.instagram.com/barrywzc/
Twitter: https://twitter.com/BarryWa34098316
Bilibili: https://space.bilibili.com/473161964
GitHub: https://github.com/wzcwzcwzc
Patreon: https://www.patreon.com/wzcspace
WeChat: wzcspace


Please leave a LIKE and SUBSCRIBE for more content!

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值