首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >"java.lang.OutOfMemoryError :无法创建新的本机线程“

"java.lang.OutOfMemoryError :无法创建新的本机线程“
EN

Stack Overflow用户
提问于 2013-05-28 18:04:45
回答 9查看 239.8K关注 0票数 146

在32k线程之后,我们在8 8GB内存虚拟机上获得"java.lang.OutOfMemoryError : unable to create new native Thread“(ps -eLF| grep -c java)

然而,"top" and "free -m" shows 50% free memory available。JDk是64位的,并尝试在HotSpot和JRockit.Server上使用Linux2.6.18

我们还尝试了OS stack size (ulimit -s)调整和最大进程(ulimit -u)限制,增加limit.conf,但都是徒劳的。

我们也尝试了几乎所有可能的堆大小组合,保持它的低,高等等。

我们用来运行应用程序脚本是

代码语言:javascript
复制
/opt/jrockit-jdk1.6/bin/java -Xms512m -Xmx512m -Xss128k -jar JavaNatSimulator.jar /opt/tools/jnatclients/natSimulator.properties

谢谢你的回复。

我们已经尝试过编辑/etc/security/limits.conf和ulimit,但仍然是一样的

代码语言:javascript
复制
[root@jboss02 ~]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 72192
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65535
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 72192
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
EN

回答 9

Stack Overflow用户

发布于 2013-05-28 18:22:26

这不是内存问题,尽管异常名称高度暗示了这一点,但这是操作系统资源问题。您正在耗尽本地线程,即操作系统允许您的JVM使用的线程数。

这是一个不常见的问题,因为您很少需要这么多。在线程应该完成但没有完成的地方,你有很多无条件的线程衍生吗?

如果可能的话,您可以考虑重写为在Executor控制下使用Callable/Runnables。有许多具有各种行为的标准执行器,您的代码可以很容易地控制它们。

(线程数量有限的原因有很多,但不同的操作系统会有所不同)

票数 90
EN

Stack Overflow用户

发布于 2019-04-10 14:45:30

如果通过systemd启动jvm,那么在某些linux操作系统中,每个进程可能会有maxTasks限制(任务实际上意味着线程)。

您可以通过运行“服务状态”来检查这一点,并检查是否有maxTasks限制。如果有,您可以通过编辑/etc/systemd/system.conf,添加一个配置来删除它: DefaultTasksMax=infinity

票数 10
EN

Stack Overflow用户

发布于 2013-05-28 18:13:41

这可能是因为您的操作系统不允许您尝试创建的线程数量,或者您达到了JVM中的某些限制。特别是如果它是像32k这样的整数,那么这样或那样的限制很可能是罪魁祸首。

你确定你真的需要32k线程吗?大多数现代语言都有对可重用线程池的某种支持--我敢肯定Java也有一些支持(就像用户Jesper提到的ExecutorService )。也许您可以从这样的池中请求线程,而不是手动创建新线程。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16789288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档