一次线程泄露问题排查笔记

这篇博客记录了一次由于线程未释放导致的内存溢出问题的排查过程。作者通过监控内存、检查线程限制、使用jstack等工具定位到问题源于`IdleConnectionMonitorThread`。代码分析发现`DefaultApacheHttpClientBuilder`每次调用都会创建新的线程,最终找到了问题根源并提出了解决方案。
摘要由CSDN通过智能技术生成

问题表现

应用启动几个小时后,死掉,临死前报错:

    org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.OutOfMemoryError: unable to create new native thread

目前服务重启了,可以预见几个小时后,程序依然会挂。

字面意思是不能创建本地进程,内存满了。可能的原因有两个:一是,本地native内存满了,不足以创建新的线程;二是线程数超出了本地文件描述符(FD,Linux下一切皆文件)限制。

问题可能就出在某几行代码上,有几个小时的反应时间,说明这个业务并发并不高。

排查过程

1. xss设置 、操作系统native内存 、剩余栈内存,及操作系统线程限制

首先,服务器执行Top命令,关注Mem,used和free;关注服务进程RES、%MEM,记下当前量,监控半小时候做比较。

KiB Mem :  7747272 total,  1063088 free,  5605736 used,  1078448 buff/cacheKiB Swap:  4186108 total,  4186108 free,        0 used.  1777504 avail Mem  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM    TIME+ COMMAND  9527 tomcat    20  0 8458412 5.165g  19016 S  5.6 69.9 886:48.03 jsvc          

然后,看xss设置,如果设置过大,每个线程占用内存过多,可创建的线程就少,不了解运维最近是否改过,谨慎起见,看看:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值