谈到安全点,这一点也是十分的重要,这个是了解gc垃圾回收器的核心入口之一。那么安全点通常发生在什么时机呢?
安全点是什么?
安全点其实就是gc垃圾回收的入口点,也就是gc垃圾回收器是在什么时候进行垃圾回收的!在程序中,我们可以想到,无非就是一些:常见的异常(Exception)Object = null…等等一些操作的时候。比如一个用户线程进来之后,在jvm的堆内存空间中首先会分配内存,也就是在Edan区(下面会为大家介绍)内会为新生的对象开辟内存区域,此后用户要进行一些逻辑业务操作,但是当中有些操作的时候不小心发生了Exception的时候,jvm可以在此时的用户线程中标记一个安全点。当用户线程的在栈中最后的一个栈帧彻底执行完毕的时候,那么此时,我们就可以在这条用户线程的这个点标记一个安全点。那么这个安全点将会供gc的垃圾回收器使用,回收jvm的内存。
jvm的中断操作是基于上述介绍用户线程中的safePoint的也就是,jvm的gc在进行垃圾回收之前就是要根据safePoint进行的,在gc算法中可能就是标记,清除,整理等词类,大致分为抢先式中断和主动式中断。
抢先式中断&主动式中断(STW)
抢先式中断
在gc回收内存之前,抢先式中断就是此时jvm会把所有的用户线程统一停止,然后迭代用户线程中的safePoint去把对应的安全区域数据存入对应的OopMap中。如果发现安全点用户线程上没有,那么久恢复用户线程。
主动式中断
主动式中断的思想就是gc需要的时候,jvm会简单的针对线程设置一个标记,用户线程自行的轮询得到gc所需的数据。
图中的GC Roots其实就是我们常在CMS和G1垃圾回收器中的所见到的可达性分析。
在这两者中的中断的意思就是我们常常听说的STW操作,也就是STOP THE WORD(静止世界)意思就是在gc回收器回收内存的时候,所有的用户线程都必须sleep活着wait起来。初学者可以以把这两种中断理解为一个同步一个异步,这样好理解一些!
有了上述的一点jvm垃圾回收概念之后,我们来聊一下jvm的垃圾回收器!
Serial垃圾回收器&算法
Serial垃圾回收器.png
Serial垃圾回收器主要采用的是gc算法中的标记复制算法以及标记整理算法。新生代中是标记复制算法,老年代中是标记整理算法。
所谓的gc垃圾回收算法,在这里也简单的为大家复现一下!
标记累加算法(jdk刚出的时候的垃圾回收算法)
标记累加算法主要的核心算法原则就是针对用户对对象的使用,有一个类似程序计数器的东西,当程序计数器到达那个值的时候将新生代中对象capy到老年代,当程序计数器为多少时(你可以理解为-负数)时将会被gc回收掉该内存。但是这个算法有很大的致命性的缺陷,那就是总会发生对象不能及时的回收或者回收出现问题等,这样就会造成jvm的内存片段,久而久之也就发生了OOM内存溢出了!
文末
今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。
最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。
还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
【Android核心高级技术PDF文档,BAT大厂面试真题解析】
【算法合集】
【延伸Android必备知识点】
【Android部分高级架构视频学习资源】
Android精讲视频领取学习后更加是如虎添翼!进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!
高级、架构师对你更是如鱼得水,赶快领取吧!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!