【线上问题笔记】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

posted @ 2025-05-12 21:56  fanblog  阅读(269)  评论(0)    收藏  举报