转载

【小威哥带你面试】第2期:FullGc触发问题

现在的面试官,哎,真是一言难尽,总是问一些千奇百怪的问题,很多问题也都是死记硬背,真的遇到的时候还不是要去搜索各种资料check一遍,毕竟人类总是健忘的生物啊。:grin:

2:面试官之恶魔出题

此时你可能已经回答了很多JVM和GC基础的问题了:

这个时候,面试官突然露出一个诡异的微笑:smirk::smirk::smirk:

【面试官】:这位同学,既然你对JVM和GC了解了的话,那么请问一下,FullGc会在什么时候出发

这个时候你的内心:MMP,这题我刚好背了,不过太紧张了想不起来了有点,但是还是要表面笑嘻嘻,心里mmp。

3:别慌,慢慢解答

这个时候,先思考下什么情况下需要做FullGc,无非是老年代的空间不足了或者即将不足了,那么其实有以下几种情况:

  • 代码中显示调用的 System.gc(),这个应该大家都知道,不过在实际情况下一般也不会直接写这个。
  • 老年代空间不足,这个空间不足有两种,一种是分配一个对象,空间真的不足。另一种是由于内存碎片,导致没有连续内存空间来分配给对象。这个也很好理解了,毕竟没有连续的内存空间就无法分配数组这样的数据结构了。
  • CMS收集器出现担保失败:Minor GC之前,会比较“老年代剩余空间”与“新生代所有对象之和”的大小,如果老年代剩余空间大于新生代之和,则本次Minor GC一定是安全的,反之,去看参数是否允许担保失败,不允许,则会触发一次Full GC。

这个其实也好理解,因为cms是不停顿的,万一此时又有用户线程操作塞了点新的对象,那么就有可能导致这个minor gc的对象进入老年代,老年代空间会不足,所以要预先清除一下老年代的空间。

  • 之前历次minorGC晋升到老年代的对象平均大小如果大于此时老年代的剩余空间,也会导致一次Full GC。这个和上面一点是差不多的,也就是认为进老年代对象太对了可能会导致老年代空间不足触发serial old导致停止stop the world。
  • metaspace空间不足也会造成Full GC。

等你说完这些,面试官又露出了满意的笑容,然后紧接着笑眯眯的问你:那么cms收集器的话是怎么工作的呢?三色收集法是什么呢?G1收集器的原理呢? 别问,问就是技术深度不够:sob::sob::sob:

4:总结

吐槽一下:其实目前的面试越来越像是套官话,套题目。小威哥觉得不如在技术上多考察一个人,还是应该尽量找一个趣味相投,人品好乐观开朗,技术中上的同事更加好一点哈哈哈。:flushed:

原文  https://juejin.im/post/5e9bed726fb9a03c763d1812
正文到此结束
Loading...