写点什么

OOM 问题原理解析(二),移动端开发技术

用户头像
Android架构
关注
发布于: 2021 年 11 月 05 日

安全点其实就是 gc 垃圾回收的入口点,也就是 gc 垃圾回收器是在什么时候进行垃圾回收的!在程序中,我们可以想到,无非就是一些:常见的异常(Exception)Object = null…等等一些操作的时候。比如一个用户线程进来之后,在 jvm 的堆内存空间中首先会分配内存,也就是在 Edan 区(下面会为大家介绍)内会为新生的对象开辟内存区域,此后用户要进行一些逻辑业务操作,但是当中有些操作的时候不小心发生了 Exception 的时候,jvm 可以在此时的用户线程中标记一个安全点。当用户线程的在栈中最后的一个栈帧彻底执行完毕的时候,那么此时,我们就可以在这条用户线程的这个点标记一个安全点。那么这个安全点将会供 gc 的垃圾回收器使用,回收 jvm 的内存。


[](


)jvm 中断操作




jvm 的中断操作是基于上述介绍用户线程中的 safePoint 的也就是,jvm 的 gc 在进行垃圾回收之前就是要根据 safePoint 进行的,在 gc 算法中可能就是标记,清除,整理等词类,大致分为抢先式中断和主动式中断。



抢先式中断 &主动式中断(STW)

[](

)抢先式中断


在 gc 回收内存之前,抢先式中断就是此时 jvm 会把所有的用户线程统一停止,然后迭代用户线程中的 safePoint 去把对应的安全区域数据存入对应的 OopMap 中。如果发现安全点用户线程上没有,那么久恢复用户线程。

[](

)主动式中断


主动式中断的思想就是 gc 需要的时候,jvm 会简单的针对线程设置一个标记,用户线程自行的轮询得到 gc 所需的数据。


图中的 GC Roots 其实就是我们常在 CMS 和 G1 垃圾回收器中的所见到的可达性分析。


在这两者中的中断的意思就是我们常常听说的 STW 操作,也就是 STOP THE WORD(静止世界)意思就


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


是在 gc 回收器回收内存的时候,所有的用户线程都必须 sleep 活着 wait 起来。初学者可以以把这两种中断理解为一个同步一个异步,这样好理解一些!


有了上述的一点 jvm 垃圾回收概念之后,我们来聊一下 jvm 的垃圾回收器!


[](


)jvm 垃圾回收器 &算法



[](

)Serial 垃圾回收器 &算法



Serial 垃圾回收器.png


Serial 垃圾回收器主要采用的是 gc 算法中的标记复制算法以及标记整理算法。新生代中是标记复制算法,老年代中是标记整理算法。


所谓的 gc 垃圾回收算法,在这里也简单的为大家复现一下!

[](

)标记累加算法(jdk 刚出的时候的垃圾回收算法)


标记累加算法主要的核心算法原则就是针对用户对对象的使用,有一个类似程序计数器的东西,当程序计数器到达那个值的时候将新生代中对象 capy 到老年代,当程序计数器为多少时(你可以理解为-负数)时将会被 gc 回收掉该内存。但是这个算法有很大的致命性的缺陷,那就是总会发生对象不能及时的回收或者回收出现问题等,这样就会造成 jvm 的内存片段,久而久之也就发生了 OOM 内存溢出了!

[](

)标记清楚算法


标记清楚算法就是在年轻代中对不用的对象进行标记,标记完成之后就会进行 gc 的清除操作,但是大家都知道内存都是连续的,我假设有这样几个对象分别在内存中连续起来是 a b c d 但是经过标记清楚算法之后,标记 c 为回收对象,那么结果就是 a b d 这样的话。c 的内存位置将会空缺出来,如果刚好有和 c 差不多大小的对象,这样内存还能刚好合理的使用掉,如果来个对象比 c 大或者小的话,那么这段内存区域就不是完整的,同样会制造出内存泄漏,也会引发 OOM。

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
OOM问题原理解析(二),移动端开发技术