堆内存泄漏移除导致tcp链接异常高
故障现象:
1:活动前端Nginx服务器TCP连接数到1万多

2:活动后端Tomcat其中1台TCP连接数达4千,并且CPU瞬间到780%(配置8核16G),内存正常
3:重启后端Tomcat后,TCP连接数正常,但是持续1~2天,TCP连接数暴增,仍需再次重启
故障分析:
Tomcat服务器TCP连接数上升,并发现象
1:Tomcat服务器内存异常,每次重启后一段时间内存使用到一定阶段后出现问题

2:Tomcat服务器top命令,服务进程异常,占用内存到4.4G后,出现CPU使用异常飙升

故障分析结论
1:Tomcat堆内存使用出现问题,GC资源回收次数增长和回收时长增加,最终导致CPU资源异常和TCP连接数飙升
故障分析结论验证
验证方法:
- 监控Tomcat服务JVM堆内存使用情况
- Tomcat启动脚本添加 JAVA_OPTS="-Dfile.encoding=utf-8 -javaagent:/home/tomcat_games/lib/jmxtrans-agent-1.2.6.jar=/home/tomcat_games/conf/jmxtrans-agent.xml" 并将数据收集到elasticsearch
- HEAP内存使用数据绘图如下: 堆内存使用超过最大允许值,直线下降部分是服务重启

故障定位:
查找具体什么原因导致堆内存无法释放
故障定位方法一:
jmap -histo:live pid |head -n 100 //查看class类使用内存排比,如下图:
可以看到很多HashMap实例很多,而且占用大量内存,其中一个占用了将近1G内存
备注:这些发给开发排查代码,但对于开发无法具体到业务代码层面,这些都是基础class,需要进一步定位问题

故障定位方法二:
jmap -dump:format=b,file=jmap.log pid //dump一个二进制文件,使用工具JProfiler分析
JProfiler下载地址:http://www.jb51.net/softs/545157.html
参考:https://www.cnblogs.com/yjd_hycf_space/p/7743049.html Jprofiler软件9.2.1版本 注册码破解
下面第2张图片,具体到一个工具类没有释放OSS连接,导致内存没有释放,内存使用占比高,
开发修复这个问题后,对外活动已经连续3天没有重启服务,并且堆内存使用和GC没有异常


故障总结
1:该故障现象持续了有一段时间,对Tomcat的JVM理解不足
2:问题定位需要持续总结,善于使用工具验证和分析,同时需要定位到具体问题,帮助研发尽快解决问题
备注:该问题解决研发发布了3个版本
- jmxtrans-agent参考:https://github.com/jmxtrans/jmxtrans-agent
堆内存泄漏移除导致tcp链接异常高的更多相关文章
- MAT工具定位分析Java堆内存泄漏问题方法
一.MAT概述与安装 MAT,全称Memory Analysis Tools,是一款分析Java堆内存的工具,可以快速定位到堆内泄漏问题.该工具提供了两种使用方式,一种是插件版,可以安装到Eclips ...
- JVM的堆内存泄漏排查-性能测试
JVM异常说明 https://testerhome.com/articles/24259 一文中已介绍了,JVM每个运行时区域--程序计数器 .Java虚拟机栈.本地方法栈.Java堆.方法区.直接 ...
- 性能测试之JVM的故障排查-堆内存泄漏
JVM异常说明(超链接) 一文中已介绍了,JVM每个运行时区域--程序计数器 .Java虚拟机栈.本地方法栈.Java堆.方法区.直接内存发生OutOfMemoryError的不同原因和不同错误信息. ...
- JVM诊断及工具笔记(4) 使用visualvm分析JVM堆内存泄漏
在这里感谢最近一直阅读我文章的小伙伴,如果觉得文章对你有用,可以帮忙关注转载,需要的时候可以及时找到文章. 背景 今年Q3季度我们在推广业务方使用Iceberg,当时为了让不同业务线的用户可以使用自己 ...
- PerfView专题 (第二篇):如何寻找 C# 中的 Heap堆内存泄漏
一:背景 上一篇我们聊到了如何去找 热点函数,这一篇我们来看下当你的程序出现了 非托管内存泄漏 时如何去寻找可疑的代码源头,其实思路很简单,就是在 HeapAlloc 或者 VirtualAlloc ...
- [BUGCASE]Webpack打包报JavaScript堆内存泄漏的错误
一.问题描述 执行npm run build之后报错: 报错信息: FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript he ...
- TCP链接异常断开后,对端仍然ESTABLISH
双方建立TCP链接,其中一方拔掉网线,另一端依然是ESTABLISHED,那么要过多长时间才会发觉链接被断开了呢? [root@node1 ~]# sysctl -a |grep keepalive ...
- .NET 垃圾回收与内存泄漏
> 前言相信大家一定听过,看过甚至遇到过内存泄漏.在 .NET 平台也一定知道有垃圾回收器,它可以让开发人员不必担心内存的释放问题,因为它会自定管理内存.但是在 .NET 平台下进行编程,绝对不 ...
- C/C++内存泄漏及检测 转
C/C++内存泄漏及检测 2011-02-20 17:51 by 吴秦, 30189 阅读, 13 评论, 收藏, 编辑 “该死系统存在内存泄漏问题”,项目中由于各方面因素,总是有人抱怨存在内存泄漏, ...
随机推荐
- 8 -- 深入使用Spring -- 1...3 容器后处理器
8.1.3 容器后处理器(BeanFactoryPostProcessor) 容器后处理器负责处理容器本身. 容器后处理器必须实现BeanFacotryPostProcessor接口.实现该接口必须实 ...
- 8 -- 深入使用Spring -- 1...2 Bean后处理器的用处
8.1.2 Bean后处理器的用处 Spring提供的两个常用的后处理器: ⊙ BeanNameAutoProxyCreator : 根据Bean实例的name属性,创建Bean实例的代理. ⊙ De ...
- c 各种编译器(gcc clang)
很多时候,出现一些类似GNU,GCC,CLANG,LLVM等与编译器有关的名词的时候,都不太清楚它到底是干嘛的,理解这些东西后, 对于xcode中很多配置型的需求修改起来都会得心应手,因此有必要了解透 ...
- linux下kill -9 pid 强制不能杀掉进程原因
今天安装集群的时候,发现一个进程一直存在,kill -9 pid 也干不掉,就找找原因了. kill -9发送SIGKILL信号将其终止,但是以下两种情况不起作用:a.该进程处于"Zomb ...
- iOS开发-UIImageView响应点击事件
UIImageView是不能够响应点击事件的,在开发过程中我们需要经常对头像等添加点击事件,上网搜索一番后发现有如下两个方法: 1.找到点击图片Event,添加事件处理函数 UIImageView.u ...
- Linux 集群架构
集群介绍 Keepalived 配置高可用集群
- C语言从零开始(十四)-字符串处理
在软件开发过程中,字符串的操作相当频繁.在标准C语言库中提供了很多字符串处理的函数.今天我们来介绍一些常用的字符串处理函数.1. 字符串输入输出1.1 printf() scanf() 之前我们学习过 ...
- Excel中countif函数的使用方法
1.countif函数的含义 在指定区域中按指定条件对单元格进行计数(单条件计数) 建议和countifs函数结合起来学习,可以观看小编的经验Excel中countifs函数的使用方法. END 2. ...
- SpringBoot学习之Helloworld
1. 如果使用Spring开发一个"HelloWorld"的web应用 创建一个web项目并且导入相关jar包.SpringMVC Servlet 创建一个web.xml 编写一个 ...
- mac Intellij Idea Tmocat 启动报 Error running Tomcat: /conf/Catalina
原因:主要是tomcat下Catalina目录没有权限导致,将其设置读写权限即可 如果在刚刚启动tomcat时出现以下问题:Error running Tomcat 8.5.31: Error cop ...