排查JVM OutOfMemoryError:unable to create new native thread

查看日志报不能创建线程

使用jmap -histo pid |head -n 10 查看前10行内存占用对象

发现java.util.concurrent.locks.AbstractQueuedSynchronizer$Node占用了160M

使用jstat -gcutil pid time 查看对内存gc信息,发现每次edom区域gc会回收垃圾线程

判断是线程创建过多导致OOM,使用如下命令查看jvm默认线程内存大小

java -XX:+PrintFlagsFinal -version | grep ThreadStackSize

线程栈内存和JVM堆不是同一内存。由于没有设置Xms和Xmx参数限制jvm大小。由于系统运行导致jvm需要扩大,扩大的过程中线程在剩余的计算机内存中开辟新线程时内存不够导致OOM。

解决办法。

1.检查前一次上线的功能代码中,一个检查用户在线online的高频接口在initClinet创建多余对象(改成单例),当用户较多时,内存消耗不断增大。同时发现有个定时任务1分钟执行1次,每次都会启动线程发送通知(降低执行任务频率)。内存增大的同时需要不断开辟新的线程空间导致OOM

2.降低线程池大小

3.设置jvm参数-Xss256k

4.固定jvm大小,设置Xms Xmx=2g