百木园-与人分享,
就是让自己快乐。

面试连环炮系列(二十六):什么情况下JVM频繁发生full GC

1. 什么情况下JVM频繁发生full GC?
full gc触发条件是老年代空间不足,具体原因有四个:

  • 系统并发高、执行耗时长或者创建对象过多,导致 young gc频繁,且gc后存活对象太多,但是survivor 区存放不下(太小或动态年龄判断) 导致对象快速进入老年代,造成full gc。
  • 过多的大对象载入到内存,新生代空间不足会转入老年代,导致full gc。
  • 发生内存溢出,老年代驻留了大量释放不掉的对象,只要有一点点对象进入老年代就达到 full gc的水位。
  • 频繁的手动调用System.gc()。

2. 在实际项目什么代码导致full GC?

  • 创建对象过大或过多,比如处理图片、缓存数据。
  • IO资源没有释放,比如网络请求没有关闭。

3. 线上怎么排查是哪个程序导致的full GC?

  1. top命令查看CPU的占用情况
    top命令获得应用程序的进程ID,Java程序的“COMMOND”列是\"java\"
  2. jstat命令查看GC的统计
jstat -gc 3038 #3038是进程号
  1. jmap命令生成堆栈文件
jmap -F -dump:format=b,file=heapDump 3038 #3038是进程号
  1. 下载heapDump文件,通过http://gceasy.io/网站或者VisualVM分析堆栈文件,观察Classes最多的一列是哪个代码导致的。
参考(摘抄的文字版权属于原作者):

https://www.cnblogs.com/mushishi/p/14553105.html
https://www.cnblogs.com/wujf/p/10972234.html
https://blog.csdn.net/soaring0121/article/details/83620480

作者:编码砖家
公众号:编码砖家
出处:https://www.cnblogs.com/xiaoyangjia/
本文版权归作者所有,任何人或团体、机构全部转载或者部分转载、摘录,请在文章明显位置注明作者和原文链接。


来源:https://www.cnblogs.com/xiaoyangjia/p/16056011.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » 面试连环炮系列(二十六):什么情况下JVM频繁发生full GC

相关推荐

  • 暂无文章