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

阅读: 评论:0

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

无法创建线程异常 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 threadat java.lang.Thread.start0(Native Method)at java.lang.Thread.start(Thread.java:714)at org.apache.http.ute(AbstractMultiworkerIOReactor.java:337)at org.apache.http.ute(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 threadsMaxProcessMemory         指的是一个进程的最大内存
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) {(e.getMessage(),e);}}}

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

本文发布于:2024-02-04 09:22:21,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170703998654333.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:线程   异常   lang   Java   OutOfMemoryError
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23