无法创建线程异常 Java.lang.OutOfMemoryError: unable to create new native thread

项目场景:

Java多线程任务,处理数据后写入elasticsearch中。


问题描述:

最开始写入是正常的,过了一段时间间,突然报错

Exception in thread "pool-66-thread-1" java.lang.OutOfMemoryError: unable to create new native thread
	at java.lang.Thread.start0(Native Method)
	at java.lang.Thread.start(Thread.java:714)
	at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor.execute(AbstractMultiworkerIOReactor.java:337)
	at org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager.execute(PoolingNHttpClientConnectionManager.java:194)
	at org.apache.http.impl.nio.client.CloseableHttpAsyncClientBase$1.run(CloseableHttpAsyncClientBase.java:64)
	at java.lang.Thread.run(Thread.java:745)

原因分析:

  1. 此问题先翻译报错信息:
    java.lang.OutOfMemoryError:无法创建新的本机线程

  2. 原因很明显:
    就是说我们创建的线程太多了,无法创建新的线程了

  3. 百度看下创建线程数量和啥有关系:

能创建的线程数的具体计算公式如下:
(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads


MaxProcessMemory         指的是一个进程的最大内存
JVMMemory                JVM内存
ReservedOsMemory         保留的操作系统内存
ThreadStackSize          线程栈的大小

原因多半就是:
创建的线程执行业务完后,没有销毁线程(或者没有归还线程资源),而线程却一直创建,最后无法创建失败报错。


解决方案:

  1. 拿到出问题ar包,本地运行。
  2. 使用本地jdk自带工具jconsole 查看程序运行状况。
    在这里插入图片描述

果然发现,线程一直在增加。确认之前的想法,线程资源没释放,而且一直在创建线程。

  1. 最后在代码里找到,发现问题所在。使用RestHighLevelClient连接es后,做完业务操作后,为使用close关闭。
    private static void closeClient(RestHighLevelClient client) {
        if (client!=null){
            try {
                client.close();
            } catch (IOException e) {
                logger.error(e.getMessage(),e);
            }
        }
    }

本类问题,只要顺着这个思路去找寻定位问题,就可以解决。希望对你有帮助!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值