我有一个Ubuntu 16.04.5服务器,运行多个Java应用程序作为根。应用程序经常(大约每30分钟到1小时)从一个OutOfMemoryError崩溃:无法创建新的本机线程
。我注意到应用程序不会单独崩溃,而是多个应用程序同时崩溃。
我不知道是什么导致了这一点,我很难找到我需要改变什么来解决这个问题。
我阅读了一些关于错误的文章,并分析了多种可能的原因,但它们似乎不适用于我的情况:
应用程序定期创建线程,但许多线程也会死亡。这意味着并发线程数不会超过10k。我通过生成线程转储和计算线程来检查我是否有失控线程创建的问题,但是线程的数量从未超过前面提到的10k。
当我运行uLimited-u
时,它返回1546669
。
这应该够了吧?
我使用大约7GB的16GB内存。这是我的htop观点:
Java版本:
错误的完整错误堆栈跟踪:
java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:717)
at de.domisum.lib.auxilium.util.java.ThreadUtil.createAndStartThread(ThreadUtil.java:126)
at de.domisum.lib.auxilium.util.java.ThreadUtil.createAndStartThread(ThreadUtil.java:114)
at de.domisum.lib.auxilium.run.RunNotifyOnTimeout.run(RunNotifyOnTimeout.java:32)
at de.domisum.lib.auxilium.util.ticker.Ticker.tickWithTimeout(Ticker.java:119)
at de.domisum.lib.auxilium.util.ticker.Ticker.run(Ticker.java:108)
at java.lang.Thread.run(Thread.java:748)
来自发生以下错误的应用程序的线程转储:线程转储
垃圾收集器日志:gc log1 gc log2 gc log3
迁移到Java11之后,这个问题就消失了。
在大约1024个线程之后,我们在jboss上得到了“java.lang.OutofMemoryError:无法创建新的本机线程”,因为应用程序消耗了最大的用户进程 你能帮我弄清楚代码哪里不对吗?在service.shutdown()之后,我应该添加tasks.clear()还是tasks.remove(ctgService)? 谢谢。
它的发生是因为我创建了许多线程,而没有关闭它们?还是经常创造新的? 有人能告诉我在代码中是否做错了什么吗?
在调用shutdown方法后,这些线程是否会被杀死。我不是java开发人员。我做了一些研发。但我不成功。
问题内容: 我看到这样的评论 我见过这个问题的一个地方是,如果您继续创建线程,而不是直接在线程对象上调用run(),而不是调用start()。这将导致线程对象不被取消引用…因此,一段时间后,出现无法创建新本机线程的消息 在Sun Java论坛上 在我的应用程序中,最初我们计划使用线程,但是后来,我们决定不再需要线程,因此我们只调用run()而不是start()。我们是否需要为新的threadCla