JVM出现连续的FullGC该怎么办?

前言

之前已经介绍了下使用GCeasy来通过图形化界面的形式分析GC日志,下面将转载一篇写的比较好的关于FullGC的文章,介绍了线上JVM连续出现FullGC的场景以及解决方案。

转载文章

FullGC是垃圾回收过程中一个非常重要的事件。当发生FullGC的时候,垃圾收集器为了回收更多的垃圾对象,它会从JVM的所有内存中回收垃圾(Young、Old、Perm、Metaspace)。FullGC有很多个步骤,有些步骤需要暂停所有的应用线程,在这个过程中JVM是无法处理用户的请求的。JVM会使用所有的CPU来做垃圾回收,因此CPU的利用率会非常高。所以一般是非常不希望应用中出现FullGC,更别说是连续的FullGC了。连续的FullGC会导致以下问题:
1.CPU利用率飙升
2.由于应用暂停导致应用的响应时间变长,这会影响服务的可用性和用户体验。
本文就来探讨下连续的FullGC相关的话题,什么是FullGC?是如何引起的?如何来解决它。

什么是连续的FullGC?
通过例子来说下会比较简单,首先来看一个经历了FullGC的真实应用的GC日志。下面是由GCeasy分析日志得出的GC堆使用图:注意图中的高亮部分,可以看到发生了连续的FullGC(图中红色的小三角就是FullGC),如果出现了FullGC说明应用出问题了。
在这里插入图片描述
从下面回收字节数的图中可以看出来,即使是经过了FullGC,JVM还是没有回收足够多的内存。因为回收的字节数非常少,可能是大部分对象都是正在使用的活跃对象,因此无法被JVM回收。
在这里插入图片描述

什么原因导致了连续的FullGC?

导致连续的FullGC主要只有一个原因:JVM的堆内存不够用或者是Perm、Metaspace内存不够用,说明应用需要比你分配的内存更多的内存。通俗地说就是小马拉大车。所以JVM必须要努力的去清理垃圾来给存活的对象分配空间。

你可能会想,我的应用已经好好的跑了很长时间了,为什么忽然就发生连续的FullGC了?这是个好问题,可能是因为以下原因:

1.可能是自从上次调优JVM的内存以后,应用的流量忽然变大了!可能是业务量增加了,用户数量变多了。

2.在业务峰值期间应用创建了比平时更多的对象,可能你并没有对峰值时候的应用内存做调优,或者是说应用峰值时候的流量变大了。

如何来解决连续的FullGC?

主要有以下几个方法:

1.增加JVM的堆内存。
因为连续的FullGC主要是由于内存不足引起的,增加JVM的堆内存可以解决这个问题。比如之前给应用分配的是2.5G的堆内存,现在增加到3G看能否解决问题,通过给JVM传递-Xmx参数可以设置JVM的最大堆内存。-Xmx3G就设置了JVM的最大堆内存是3G。如果还是没解决问题,一点点的继续增加JVM的堆内存。不要给JVM分配过多的堆内存,因为这会增加GC的停顿时间。

2.增加Perm或者Metaspace内存
如果Perm区或者是Metaspace太小也会导致连续的FullGC,这种情况下就需要增大Perm或者是Metaspace的内存。

3.增加更多的JVM实例
另一个解决此问题的办法就是增加更多的JVM实例。当有更多的JVM实例以后,应用流量就会分摊到这些实例上,单个JVM承担的流量就降低了,那么它上面需要创建的对象随之也变少了,此时可能就不会有连续的FullGC了。

验证解决办法

如论你是用哪种办法来解决这个问题,在应用到生产环境之前一定要在测试环境做好测试,因为任何对JVM对内存设置的改变都需要进行充分的测试和验证才可以,要确保不会引起其他问题。

转载原文:
https://mp.weixin.qq.com/s/S116BZtPmLS1e1e9voEpbA
英文原文:
https://blog.gceasy.io/2016/11/22/eliminate-consecutive-full-gcs/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值