记录一次内存泄漏导致服务端口不可用问题的定位过程,第一次发博客
背景:2021年4月的某一天,公司迁移服务器之后,某服务的端口,出现大量端口不通告警,告警机制为使用nc命令扫描端口 nc -v -w 3 -z|
猜想原因1:是否是网络问题
排除1:因为服务器上另外一端口,无告警情况
排除2:通过其他服务器ping告警主机,无异常丢包情况
猜想原因2:是否是因为负载不均衡
排除1:负载负责厂商检查一切正常
排除2:比对报警前后,无负载异常,且报警的时候,请求并未达到最高峰
猜想原因3:是否是数据库问题:
排除1:疑惑:数据库日志确实有许多拒绝报警服务器连接的情况,但核查慢查询日志并未异常之处
发现1:
最后定位中发现,tomcat中告警开始时,有出现线程满了得告警。
Maximum number of threads (1024) created for connector with address null and port 8193
尝试解决1:
将tom得最大线程从1024增加到2048。但是没有用,在周末高峰期还是出现了大量告警。
最后原因定位:使用jstat命令和jmap命令
jmap -heap 分析堆内存使用情况。发现old区域内存长得很快,可能存在频繁full GC现象,可能有内存泄漏情况
jstat -gccause 分析GC情况,确实存在频繁full GC情况
jmap -dump 分析内存情况
问题1:发现有一对象达到1M每个,且频繁被创建,这是造成内存泄漏最主要得原因
问题2:log4j有许多线程阻塞
最后解决:
1.将问题1中得对象,改为单例模式
2.将log4j日志输出级别改为info
总结:
出现端口不通,不一定是网络问题或者咱们常想到得负载问题,也有可能是程序服务的问题。
此次问题原因总结:内存中有一对象占用内存较多,且频繁被创建,造成内存泄漏,服务频繁处于full GC状态,服务不能正常处理请求,大量请求堵塞。tomcat线程爆满。
因为tomcat所承载得服务不能正在使用,所以其端口也不能正常访问,出现不通情况
为啥迁移服务器之后出现了告警,迁移前后代码无改动,唯一改动的可能是负载方式,硬件,网络等,最终造成问题原因还不得而知,本次只是解决了问题。

浙公网安备 33010602011771号