文档章节

生产环境GC故障解决过程记录

陈小扁
 陈小扁
发布于 2017/04/07 11:15
字数 1288
阅读 60
收藏 5

排查了五六个小时,终于解决了GC的问题,记录一下希望可以帮到有需要的人,本文假定读者对GC知识有一定的了解 如果不了解可以先参考我的博客 https://my.oschina.net/chenxiaobian/blog/726840

1.背景说明

发生的问题是公司一台跑linux服务器上的应用,下午接到通知说整个服务挂了,于是登上服务器一看状态 发现服务是启动的,但是访问应用确实是没任何响应,于是通过命令top查看了一下cpu的运行状态,发现一个叫jetty的进程占用cpu 比例为100%,初步一看肯定是内存泄漏了

 

2.解决过程

于是通过命令查看一下JVM的配置参数

ps -ef|grep jetty|grep -v grep

查到

 -Xmx1536m -Xms1536m -Xmn576m -Xss512K -XX:PermSize=384m -XX:MaxPermSize=384m 

可以看到持久代被设置为384M,堆内存被设置为1536M(-Xms和--Xmx设为相等避免了“堆震荡”,能在一定程度减少GC次数,但会增加平均每次GC消耗的时间),年轻代被设置为576M

接下来分别一一进行排查

通过top命令可以查到占用内存最大的进程号

通过执行命令

jstat -gc 28048 250 4;//每250ms执行一次,一共4次

看了下堆中各代的占用情况和GC情况,发现了一个挺恐怖的现象:Eden区占用77%多,S0占用100%,Old和Perm区都有很大空间剩余

怀疑是新生代空间不足,但是没有确切证据,只好用jstack获取线程Dump信息 执行

jstack -F 28048

不看不知道,一看就发现了一个问题(没有发现线程死锁,这里应该是“活锁”问题)

从上面第一段可看到有一个Low Memory Detector系统内部线程(JVM启动的监测和报告低内存的守护线程)一直占着锁0x00....00,而下面的C2 CompilerThread1、C2 CompilerThread0、Signal Dispatcher和Surrogate Locker线程都在等待这个锁,导致整个JVM进程都hang住了

于是打算调大整个堆内存大小、调大新生代大小(-Xmn参数)、调大新生代中Survivor区占的比例(-XX:SurvivorRatio)

  重启系统后用jstat -gcutil pid 1000命令发现一个更恐怖的现象,如下图:Eden区内存持续快速增长,Survivor占用依然很高,大概每两分钟就Young GC一次,并且每次Young GC后年老代内存占用都会增加不少,这样导致可以预测每三四个小时就会发生一次Full GC,这是很不合理的

于是我用

jmap -histo:live

(注意jmap命令会触发Full GC,并发访问量较大的线上环境慎用)查看了下活对象,发现有一些Integer数组和一些Character数组占用内存在持续增长,并且占了大概好几百M的内存,然后经过Young GC又下降,然后再次快速增长,再Young GC下降,周而复始

 至此,我推测可能是大量的Integer数组对象和Character数组对象基本占满了Survivor,导致在Eden满了之后,新产生的Integer数组对象和Character数组对象不足以放入Survivor,然后对象被直接被Promote到了年老代,这种推测部分正确,它解释了S1占用那么高的原因,但不能解释上面的Eden区内存占用持续上升。

于是继续查看了下接口调用日志,不看不知道,一看吓一跳:日志刷新非常之快(99%是ERROR日志,原因就在于大量的系统接口调用触发了大量ERROR和DEBUG日志刷新,写日志对于线上系统是一个重量级操作,无论是对CPU占用还是对内存占用,所以高并发线上系统一定要记得调高日志级别为INFO甚至ERROR

 

于是通过jmap命令

jmap -dump:format=b,file=/tmp/dump.dat 20248 

把文件dump下来通过heap analyzer打开分析发现是一个叫automsphere占用堆栈空间达92%以上,通过工具把dump.dat文件打开进行分析排查

 

通过后台ERROR日志发现一直在建立socketConnetion 连接,所以通过这里猜测肯定是程序中有问题,通过排查发现程序会有一个聊天功能需要用到automsphere

 

3.总结

需要说明一下,本文当中很多截图并不是当时现场的图,因为时间紧迫没来得及截图,本文是对这次事故的一次总结,推荐几篇不错的GC方面的文章

   JVM内存管理:深入Java内存区域与OOM http://www.iteye.com/topic/802573

   JVM内存管理:深入垃圾收集器与内存分配策略 http://www.iteye.com/topic/802638

   GC实践总结 http://www.iteye.com/topic/473874

   JVM内存的分配及回收 http://blog.csdn.net/eric_sunah/article/details/7893310

   一步一步优化JVM系列 http://blog.csdn.net/zhoutao198712/article/category/1194642

 

 

© 著作权归作者所有

共有 人打赏支持
陈小扁

陈小扁

粉丝 52
博文 87
码字总数 70963
作品 0
浦东
高级程序员
私信 提问
加载中

评论(1)

c
ch751652064
收藏了:smile:
如何避免后台IO高负载造成的长时间JVM GC停顿

译者注:其实本文的中心意思非常简单,没有耐心的读者建议直接拉到最后看结论部分,有兴趣的读者可以详细阅读一下。 原文发表于Linkedin Engineering,作者 Zhenyun Zhuang是Linkedin的一名S...

重度恐高症
2016/02/20
51
0
drds节点异常处理,docker节点进程一直重启

版本: 问题现象: 排查过程: 向现场运维组反馈该异常后,为了确保生产环境的使用,确定通过drds manager进行白屏重启。点击重启后,无法返回成功界面,又强制重启,还是没有响应。 然后尝试...

化雨u
09/29
0
0
【MySQL故障处理】 Seconds_Behind_Master= NULL Error_code: 1197

将处理主从故障的过程记录在此: 故障1,Errorcode: 1197 (maxbinlogcachesize) 数据库版本:5.7.9 报错信息: [ERROR] Slave SQL for channel '': Worker 1 failed executing transactio...

Amnesiasun
2017/06/03
0
0
你敢在Oracle 12c R2上做大表truncate吗?

作者介绍 郭远胜,中国移动通信集团湖南有限公司系统支撑中心技术专家,主导了湖南移动业务支撑中心数据库双中心建设、数据标准化建设等项目。 魏斌,新炬网络数据库专家,Oracle 11G、12C O...

郭远胜 魏斌
07/04
0
0
连续2周多次Hang,只因应用大量跨节点访问RAC数据库!

注:文章涉及的程序名、用户名、表名、索引名、序列名均作了脱敏处理。 某客户核心系统数据库工作日生产时间发现会话积压,存在大量异常等待事件,部分节点所有联机日志组全部处于Active状态...

袁伟翔、魏斌、杨志洪
2017/01/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

0020-使用JDBC向Kudu表插入中文字符-双引号的秘密

1.问题描述 使用Impala JDBC向Kudu表中插入中文字符,插入的中文字符串乱码,中文字符串被截断。 2.问题复现 测试环境: CDH5.12.0 Kudu1.4.0 ImpalaJDBC41_2.5.35 1.使用ImpalaJDBC代码进行...

Hadoop实操
7分钟前
0
0
配置防盗链、访问控制Directory、访问控制FilesMatch

11月19日任务 11.25 配置防盗链 11.26 访问控制Directory 11.27 访问控制FilesMatch 一.配置防盗链 通过限制referer来实现防盗链的功能 配置文件增加如下内容 <Directory /data/wwwroot/www...

hhpuppy
8分钟前
1
0
Java内存管理 -JVM 垃圾回收

一.概述 相比起C和C++的自己回收内存,JAVA要方便得多,因为JVM会为我们自动分配内存以及回收内存。 在之前的JVM 之内存管理 中,我们介绍了JVM内存管理的几个区域,其中程序计数器以及虚拟机...

终日而思一
10分钟前
0
0
Nginx 服务器之速率限制

Nginx服务器有一个非常有用的限速功能,但是它却常常被错误配置。 这个功能用来限制用户在某此时间段内请求的的HTTP请求数,此请求应该是 GET 或POST 来发出的请求。 这个限速功能常常被应用...

架构师springboot
21分钟前
0
0
锁和分布式锁

锁的由来 : 多线程环境中,经常遇到多个线程访问同一个 共享资源 ,这时候作为开发者必须考虑如何维护数据一致性,这就需要某种机制来保证只有满足某个条件(获取锁成功)的线程才能访问资源...

微笑向暖wx
24分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部