面试时候总喜欢问的JVM要点在哪?(下)

经过回收之后Surior1就变了,1对象是从Enden直接复制过来的,2对象是Enden-->Survior2-->Survior1 ,3对象则是从Enden-->Surivior1-->Survior2-->Survior1 复制过来的,这样一步一步的执行下去的时候,就是新生代的GC。

这就是新生代采用的 GC ,如果你需要给面试官解释,那么你就得熟练的记住这个图,为什么这么说,因为只有你掌握了这个图,那么你绝对会把这个复制算法给面试官讲述的明明白白。

既然我们都知道了这个复制算法了,那么他到底有什么缺点呢?

  • 堆利用效率低 这是最明显的,空间都被劈成两半了,一次永远只能用一半就得搬家
  • 递归调用 在对子对象进行复制时,使用了递归方法,可能导致栈溢出

但是我们也得吹一下复制算法的牛逼的地方呀。

吞吐量高所谓吞吐量就是搜索活动对象的时间比上搜索堆时间,越高说明你的有效搜索占比越高,不难看出,我们都是从根开始,搜索的全部是活动对象,并没有浪费时间去搜索垃圾对象。这个优势在堆越大的场景下越明显。

没有碎片

在将活动对象复制到To空间时,他们都是紧挨着的,然后清空From时全部清空,完全没有碎片的可能。

这也是新生代使用的垃圾回收的算法。

JVM 的老年代(垃圾回收机制)

老年代的垃圾回收机制,采用的则是和新生代不一样的方式,有些人称之为FullGC,而FullGC出现的原因则是:在新生代如果说存在的对象或者说新创建 出来的对象由于某些原因需要移动到老年代中,但是老年代中压根就没有这么大的内存空间去容纳这个对象, 那么就会引发一次FullGC,如果在执行完FullGC之后,还是没有办法给这些对象分配内存,那么凉了,该抛出异常了,异常类型就是OutOfMemoryError。

而FullGC使用的是和MinorGC不一样的算法,它使用的是标记清除算法,听名字,挺好理解的,来波图示解析一波。深入了解JVM一书中的图示是这个样子的,

面试时候总喜欢问的JVM要点在哪?(下)

图示是不是看着也挺明确,先标记,然后在删除。

•标记(Mark)过程:找到所有的可以访问的对象,做个指定的标记。

•清除(Swep)过程:遍历堆内存,把未标记的对象进行一个回收。

在了解了这个之后,我们还得说一个概念,那就是GC Root,Root我们可以理解成一个根节点就像这个样子

面试时候总喜欢问的JVM要点在哪?(下)

上图中的a,b,c,d,就是活着的对象,如果说存在这引用,比如说b引用的a,那么a他就是属于活着的对象。当我们老年代内存区中的有效的内存空间不够的时候,那么这时候整个世界都要安静下来了(stop the world),这时候就要开始准备进行垃圾回收了。

•标记:遍历所有的GC Roots,然后将所有GC Roots可达的对象标记为存活的对象。就是我们图中所标记的a,b,c,d.•清除:清除的过程将遍历堆中所有的对象,将没有标记的对象全部清除掉。也就是说,如果内存不够,GC线程就会被触发然后将程序暂停,随后将依旧存活的对象标记一遍,最后再将堆中所有没被标记的对象全部清除掉,接下来便让程序继续恢复运行。

流程图就像这个样子的 初始下的老年代中的对象状态

面试时候总喜欢问的JVM要点在哪?(下)

这时候都是没有被标记的状态,接下来内存不够,GC线程停止,开始进行标记了

面试时候总喜欢问的JVM要点在哪?(下)

按照根节点开始遍历 标记的abcdeh都是存活的对象,接下来开始标记。


面试时候总喜欢问的JVM要点在哪?(下)

接下来就是清除数据了

面试时候总喜欢问的JVM要点在哪?(下)

清楚完成之后还有就是把标记去除掉,可以下次进行标记清除的时候继续清除

面试时候总喜欢问的JVM要点在哪?(下)

其实这个阿粉的老读者肯定看过,因为很早之前阿粉就画出过这个图。

这样标记清除就执行完毕了。

这时候不吹不黑,肯定会有优缺点,不然为啥不采用其他的方法呢?毕竟 JVM 肯定是会选择最适合自己的方式来进行 GC 的。

缺点清除后的堆内存由于空间不连续,即内存碎片化,若下一次需要分配对象的内存大于碎片空间,这样会提前触发GC,当提前触发的GC回收后,空间还是不足就会出现OOM等错误。

时间问题:由于分为两个过程(标记、清除),当堆内可回收对象较多时,该算法需要进行大量的标记与清除,这里就产生一个问题,随着可回收对象的的增多,标记和清除的效率就会下降;再者由于空间不连续导致每次再次分配都要遍历空闲列表。

有点

实现简单,与保守式GC算法兼容 这阿粉真的说不上他其他的优点了,除了能够解决引用计数算法带来的不能清除循环引用的问题外,阿粉实在不知道了。

关于 JVM 的知识要点,你学会了么?

上一篇:【新人福利】前端学习路线,再也不用发愁自己该从何学习


下一篇:「免费开源」基于Vue和Quasar的crudapi前端SPA项目实战之用户登录(二)