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)
此问题先翻译报错信息:
java.lang.OutOfMemoryError:无法创建新的本机线程
原因很明显:
就是说我们创建的线程太多了,无法创建新的线程了
百度看下创建线程数量和啥有关系:
能创建的线程数的具体计算公式如下:
(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threadsMaxProcessMemory 指的是一个进程的最大内存
JVMMemory JVM内存
ReservedOsMemory 保留的操作系统内存
ThreadStackSize 线程栈的大小
原因多半就是:
创建的线程执行业务完后,没有销毁线程(或者没有归还线程资源),而线程却一直创建,最后无法创建失败报错。
果然发现,线程一直在增加。确认之前的想法,线程资源没释放,而且一直在创建线程。
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小时内删除。
留言与评论(共有 0 条评论) |