【线上问题笔记】java.lang.OutOfMemoryError: unable to create native thread: possibly out of memory or process/resource limits
报错信息有多种:
(A) jakarta.servlet.ServletException: Handler dispatch failed: java.lang.OutOfMemoryError: unable to create native thread: possibly out of memory or process/resource limits
(B)reactor.core.Exceptions warn:304 -throwIfFatal detected a jvm fatal exception, which is thrown and logged below:
java.lang.OutOfMemoryError: unable to create native thread: possibly out of memory or process/resource limits
内存泄漏排查
1、线程创建不了了,是不是达到系统线程的上限了?
查看系统可以生成的最大线程数量 cat /proc/sys/kernel/threads-max 这个值有6万多,并没有超。
2、查看所有线程情况 ps -eLf 发现当前大部分线程信息都是jdk的,线程信息中带有/xxx/jre/bin/java,;
统计当前线程数ps -eLf |wc -l 这时看到线程数达到2万多!!!grep -v 排除后只有1千线程,就是说java进程创建的线程达到2万多
3、top查看进程负载情况,内存消耗不到50%,可用内存较多,不是内存问题。
4、通过top -Hp javaPid(Java进程id)查看进程内线程情况, 通过查看线程发现
大量的pool-数字-thread-数字的线程名字, 这个一搜,是在java.util.concurrent.Executors类的内部静态类DefaultThreadFactory中,
-> Executors.defaultThreadFactory()方法 -> ThreadPoolExecutor构造函数 -> new FixedThreadPool() -> 代码中Executors.newFixedThreadPool()这里创建的ExecutorService没有关闭,这段代码所在的方法执行完了之后,线程并没销毁。通过压测这个接口,确实达到2万多线程后,报上面的错误。
修复:
在finally中加入executorService.shutdown();关闭
压测后线程维持在1千多,OK
补充记录:
1、通过spring带的健康检查功能导出的线程信息,没有看出来问题。curl -kv https://127.0.0.1:port/actuator/threaddump > /tmp/mythread.txt
2、通过jstack查看的线程信息
printf "%x\n" 线程id十进制值; ./jstack -l(小写的L) Pid |grep 10f7b2 -A 100
浙公网安备 33010602011771号