【案例51】内存溢出分析实战

一、问题现象

在使用 NC 过程中发现,系统时不时就不可用,一直在转圈。

通过浏览器访问系统时,页面长时间无法加载。

d4dc210d7635414e80079327d086bf09.png

二、环境信息

系统为 NC 单点环境,在线人数为 30 人左右。

763aa74aabde4b4da23d21bd36c747ab.pngJDK版本如图也是正常的。

744eeccea4d24f75aaa63ba00b971090.png

三、问题分析 

在发现问题时观察 NMC,发现有一段时间的 NC 内存表现异常。

e275edb3bf45449d881d3b0b9c6860b3.png

检查服务器的堆的进程内存使用状况,发现已经使用了 5.7G。

ceefd77a577a4b06b93bf2487e2439fe.png

在 NMC 中发现了堵塞的线程。

92f940ef7b494b52aaf0d53f70be3c08.png

但实际分析后发现与线程无关。

java.lang.Object.wait(Native Method)
org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1304)
org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1207)
org.apache.coyote.http11.Http11InputBuffer.fill(Http11InputBuffer.java:805)
org.apache.coyote.http11.Http11InputBuffer.access$300(Http11InputBuffer.java:42)
org.apache.coyote.http11.Http11InputBuffer$SocketInputBuffer.doRead(Http11InputBuffer.java:1172)
... ...
sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
java.io.InputStreamReader.read(InputStreamReader.java:184)
java.io.BufferedReader.fill(BufferedReader.java:161)
java.io.BufferedReader.readLine(BufferedReader.java:324)
java.io.BufferedReader.readLine(BufferedReader.java:389)
nccloud.framework.web.container.Request.readJsonAndConvertVO(Request.java:345)
nccloud.framework.web.container.Request.readSysParam(Request.java:322)
nccloud.framework.core.filter.LoginFilter.doFilter(LoginFilter.java:159)
sun.reflect.GeneratedMethodAccessor1130.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Method.java:498)
... ...
java.security.AccessController.doPrivileged(Native Method)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
... ...
org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:311)
org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:253)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:188)
... ...
java.security.AccessController.doPrivileged(Native Method)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
nccloud.ws.opm.core.filter.OpenCloudOAuthFilter.doFilter(OpenCloudOAuthFilter.java:168)
sun.reflect.GeneratedMethodAccessor1130.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Method.java:498)
org.apache.catalina.security.SecurityUtil.lambda$execute$0(SecurityUtil.java:280)
org.apache.catalina.security.SecurityUtil$$Lambda$136/1104480242.run(Unknown Source)
java.security.AccessController.doPrivileged(Native Method)
javax.security.auth.Subject.doAsPrivileged(Subject.java:549)
org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:311)
org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:253)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:188)
org.apache.catalina.core.ApplicationFilterChain.lambda$doFilter$0(ApplicationFilterChain.java:146)
org.apache.catalina.core.ApplicationFilterChain$$Lambda$385/1565205587.run(Unknown Source)
... ...

在sysconfig中增加了 -XX:+HeapDumpOnOutOfMemoryError参数,以便在系统发生内存溢出时生成堆转储文件。

20b3625adc654979b5cf5b96c4034107.png

在系统又发生异常时发现相关宕机文件生成

4d9c4e243dd94ca39f693ae7d451f9a3.png

一开始用IBM分析工具ha457.jar打开了相关的宕机文件。实际hprof文件大小为4.8G。

24d704040372492389529edc5f9e8010.png 但是在IBM分析工具中发现最大对象为400M。也没有看到有效的信息。

cb728beab2c34bf4bd02b1d8ae1a9f3e.png

后续用visual分析,打开直接能看到线程发现发生问题的线程信息

8ffbb536f2f140d7a5cb26d1793c6f40.png 

查看线程信息(关键信息已隐藏)

nc.impl.xxx.xxx.xxx.xxx(TodoMsgServiceImpl.java:122

ac4259d8e83f4d91a2995b73fa6ecc7a.png

查看了相关代码这块发生的问题。

dd8bc7ca15e44c268a7dae60c27e2cf5.png 四、解决方案

联系对应模块研发,出具相关补丁修复。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值