fullgc的原因

Full GC触发条件:

(1)System.gc()方法的调用

该方法不一定执行,但是执行的时候是fullgc。

(2)老年代空间不足

老年代空间只有在新生代对象转入及创建为大对象、大数组时才会出现不足的现象,当执行Full GC后空间仍然不足,则抛出如下错误:

java.lang.OutOfMemoryError: Java heap space

为避免以上两种状况引起的Full GC,调优时应尽量做到让对象在Minor GC阶段被回收、让对象在新生代多存活一段时间及不要创建过大的对象及数组。

(3)方法区空间不足

在HotSpot虚拟机中又被习惯称为永生代或者永生区,Permanet Generation中存放的为一些class的信息、常量、静态变量等数据,当系统中要加载的类、反射的类和调用的方法较多时,Permanet Generation可能会被占满,在未配置为采用CMS GC的情况下也会执行Full GC。如果经过Full GC仍然回收不了,那么JVM会抛出如下错误信息:

java.lang.OutOfMemoryError: PermGen space

为避免Perm Gen占满造成Full GC现象,可采用的方法为增大Perm Gen空间或转为使用CMS GC。

(4)CMS GC时出现promotion failed和concurrent mode failure

对于采用CMS进行老年代GC,要注意GC日志中是否有promotion failed和concurrent mode failure两种状况,当这两种状况出现时可能会触发Full GC。

promotion failed是在进行Minor GC时,survivor space放不下、对象只能放入老年代,而此时老年代也放不下造成的;concurrent mode failure是在

执行CMS GC的过程中同时有对象要放入老年代,而此时老年代空间不足造成的(有时候“空间不足”是CMS GC时当前的浮动垃圾过多导致暂时性的空间不足触发Full GC)。

措施为:增大survivor space、老年代空间或调低触发并发GC的比率,但在JDK 5.0+、6.0+的版本中有可能会由于JDK的bug29导致CMS在remark完毕后很久才触发sweeping动作。

对于这种状况,可通过设置-XX: CMSMaxAbortablePrecleanTime=5(单位为ms)来避免。

(5)Minor GC晋升到老年代的平均大小大于老年代的剩余空间

Hotspot为了避免由于新生代对象晋升到旧生代导致旧生代空间不足的现象,在进行Minor GC时,做了一个判断,如果之前统计所得到的Minor GC晋升到旧生代的平均大小大于旧生代的剩余空间,那么就直接触发Full GC。

例如程序第一次触发Minor GC后,有6MB的对象晋升到旧生代,那么当下一次Minor GC发生时,首先检查老年代的剩余空间是否大于6MB,如果小于6MB,则执行Full GC。

当新生代采用PS GC时,方式稍有不同,PS GC是在Minor GC后也会检查,例如上面的例子中第一次Minor GC后,PS GC会检查此时旧生代的剩余空间是否大于6MB,如小于,则触发对旧生代的回收。

(6)堆中分配很大的对象

所谓大对象,是指需要大量连续内存空间的java对象,例如很长的数组,此种对象会直接进入老年代,而老年代虽然有很大的剩余空间,但是无法找到足够大的连续空间来分配给当前对象,此种情况就会触发JVM进行Full GC。

为了解决这个问题,CMS垃圾收集器提供了一个可配置的参数,即-XX:+UseCMSCompactAtFullCollection开关参数,用于在“享受”完Full GC服务之后额外免费赠送一个碎片整理的过程,内存整理的过程无法并发的,空间碎片问题没有了,但提顿时间不得不变长了,JVM设计者们还提供了另外一个参数 -XX:CMSFullGCsBeforeCompaction,这个参数用于设置在执行多少次不压缩的Full GC后,跟着来一次带压缩的。

补充2种fullgc情况

1.未指定老年代和新生代大小,堆伸缩时会产生fullgc。

2.直接内存

Cms退化为serial gc的情况

Minor GC后存活的对象晋升到老年代时由于悲观策略的原因,有两种情况会触发Full GC,:

1.之前每次晋升的对象的平均大小 > 老年代剩余空间;

2.Minor GC后存活的对象超过了老年代剩余空间。

这两种情况都是因为老年代会为新生代对象的晋升提供担保,而每次晋升的对象的大小是无法预测的,所以只能基于统计,1个是基于历史平均水平,一个是基于下一次可能要晋升的最大水平。这两种情况都是属于promotion failure。

CMS失败,发生concurrent mode failure会引起Full GC,这种情况下会使用Serial Old收集器,是单线程的,对GC的影响很大。concurrent mode failure产生的原因是老年代剩余的空间不够,导致了和gc线程并发执行的用户线程创建的大对象(由PretenureSizeThreshold控制新生代直接晋升老年代的对象size阀值)不能进入到老年代,只要stop the world来暂停用户线程,执行GC清理。可以通过设置CMSInitiatingOccupancyFraction预留合适的CMS执行时剩余的空间。

新生代直接晋升到老年代的大对象超过了老年代的剩余空间,引发Full GC。

注意于promotion failure的区别,promotion failure指的是Minor GC后发生的担保失败。

Perm区回收

Perm永久代空间不足会触发Full GC,可以让CMS清理永久代的空间。设置CMSClassUnloadingEnabled即可。

System.gc()引起的Full GC,可以设置DisableExplicitGC来禁止调用System.gc引发Full GC 。

使用CMS(ConcMarkSweep)策略时,必须有:-XX:+CMSPermGenSweepingEnabled 和-XX:+CMSClassUnloadingEnabled
来配合同时启用,才可以对PermGen进行GC(实际主要参数为:-XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled  -XX:+CMSPermGenSweepingEnabled)。

调优方案

(1)观察gc情况,结合代码,调整线程数,可以减少fullgc次数,但是计算时间消耗很大。

(2)由于这种频繁的fullgc只是在早上汇总时候产生,并且正常每天一次,所以解决方案是更换gc,将由一台机器进行汇总,其他机器不影响。

jvm的gc相关参数:

-Xmx4096m -Xms4096m

-XX:MetaspaceSize=256m

-XX:MaxMetaspaceSize=512m

-XX:SurvivorRatio=8

-XX:ParallelCMSThreads=8

-XX:+CMSParallelRemarkEnabled  开启降低标记停顿

-XX:+ExplicitGCInvokesConcurrent

-XX:+CMSPermGenSweepingEnabled

-XX:+CMSClassUnloadingEnabled

-XX:+PrintGCCause

-XX:+PrintGCDetails

-XX:+PrintHeapAtGC

-XX:+PrintTenuringDistribution

-XX:+UseConcMarkSweepGC

-XX:+PrintGCTimeStamps

-XX:+PrintGCDateStamps

-XX:CMSFullGCsBeforeCompaction=0

-XX:+UseCMSCompactAtFullCollection

-XX:CMSInitiatingOccupancyFraction=80

CMS发生FullGc分析相关推荐

  1. 解决fullgc_CMS发生FullGc分析

    fullgc的原因 Full GC触发条件: (1)System.gc()方法的调用 该方法不一定执行,但是执行的时候是fullgc. (2)老年代空间不足 老年代空间只有在新生代对象转入及创建为大对 ...

  2. Java中 9 种常见的 CMS GC 问题分析与解决

    目录 Java中 9 种常见的 CMS GC 问题分析与解决 1. GC 1.1 引言 1.2 概览 2. GC 基础 2.1 基础概念 2.2 JVM 内存划分 2.3 分配对象 2.4 收集对象 ...

  3. 美团技术总结:Java中9种常见的CMS GC问题分析与解决

    1. 写在前面 | 本文主要针对 Hotspot VM 中"CMS + ParNew"组合的一些使用场景进行总结.重点通过部分源码对根因进行分析以及对排查方法进行总结,排查过程会省 ...

  4. 美团技术:Java中9种常见的CMS GC问题分析与解决

    目前,互联网上 Java 的 GC 资料要么是主要讲解理论,要么就是针对单一场景的 GC 问题进行了剖析,对整个体系总结的资料少之又少.前车之鉴,后事之师,美团的几位工程师历时一年多的时间,搜集了内部 ...

  5. Java中常见的CMS GC问题分析与解决(一)

    Java中常见的CMS GC问题分析与解决(一) 目前,互联网上 Java 的 GC 资料要么是主要讲解理论,要么就是针对单一场景的 GC 问题进行了剖析,对整个体系总结的资料少之又少.前车之鉴,后事 ...

  6. java gc日志乱码_Java中9种常见的CMS GC问题分析与解决(四)

    目前,互联网上 Java 的 GC 资料要么是主要讲解理论,要么就是针对单一场景的 GC 问题进行了剖析,对整个体系总结的资料少之又少.前车之鉴,后事之师,美团的几位工程师历时一年多的时间,搜集了内部 ...

  7. BetaFlight模块设计之二十:CMS菜单模块分析

    BetaFlight模块设计之二十:CMS菜单模块分析 CMS菜单模块 CMS菜单按键控制 CMS菜单Elements CMS_Menu OSD_Etnry Element类型 可调Element类型 ...

  8. 墨者学院 - CMS系统漏洞分析溯源(第9题)

    CMS系统漏洞分析溯源(第9题) 本题就是利用了discuz 7.2 中的faq.php文件sql注入漏洞的一个0day 下载exp 利用 admin用户的密码无法破解,所以直接用webshell的链 ...

  9. JVM调优——之CMS GC日志分析

    最近在学习JVM和GC调优,今天总结下CMS的一些特点和要点,让我们先简单的看下整个堆年轻代和年老代的垃圾收集器组合(以下配合java8完美支持,其他版本可能稍有不同),其中标红线的则是我们今天要着重 ...

最新文章

  1. linux服务器读写硬盘io,查看linux服务器硬盘IO读写负载
  2. 设计模式18---设计模式之策略模式(Strategy)(行为型)
  3. oracle rac 图形化界面,oracle 10g rac配置vipca进不了图形界面,请高手帮忙分析下
  4. Ouroboros:一个可证明安全的PoS区块链协议 (共识介绍)
  5. 利用xposed绕过安卓SSL证书的强校验
  6. 我是SQL小菜鸟---SQL全局临时表防止用户重复登录
  7. RHEL6.3配置文件共享(3) Samba服务之一
  8. 数学猜想验证步骤_高中数学解题思路与技巧汇总,19种解题方法,实用!
  9. Access导入SQL2005
  10. 一点创业想法:读书类垂直博客
  11. fence_ilo can't connect by ssl, since CentOS 5.8 lack pyOpenSSL
  12. 【网络安全】XCodeGhost事件刨根问底
  13. vim配置:高亮所在的行和列
  14. 基于C51的步进电机控制器设计
  15. 清北复交人浙南 计算机交叉学科项目大盘点
  16. 微信公众号关注自动回复,关键词自动回复,一个PHP文件就可以搞定!
  17. nlp情感分析经典书籍推荐_通过无监督学习对书籍进行情感分析
  18. 江苏大学计算机学院在职研究生,江苏大学电子与通信工程在职研究生招生简章...
  19. 汉诺塔游戏(Python)
  20. 基于PHP+Mysql全品类在线购物商城设计

热门文章

  1. poj 2728 Desert King(最小比率生成树 / 0-1分数规划 / 二分)
  2. P2057 [SHOI2007]善意的投票 (最大流最小割)
  3. 【网络流】解题报告:luogu P3376 【模板】网络最大流
  4. 【每日DP】day3 P1387 最大正方形(奇怪的DP增加了 / 二维前缀和)难度⭐⭐★
  5. 信噪比与错误指数matlab,关于信噪比不符合理论值的问题
  6. 快捷指令_苹果怎么关闭快捷指令通知提醒 取消ios14快捷指令设置方法
  7. date对象加十分钟_一张图讲解对象锁和关键字synchronized修饰方法(代码块)
  8. Linux命令CURL用法
  9. window.open的用法---javascript学习笔记
  10. 配置maven Spring项目