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

面试连环炮系列(二十六):什么情况下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是进程号
  3. jmap命令生成堆栈文件
    jmap -F -dump:format=b,file=heapDump 3038 #3038是进程号
  4. 下载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

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注