“java.lang.OutOfMemoryError : unable to create new native Thread”如何解决?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (162)

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

但是,"top" and "free -m" shows 50% free memory available。JDK是64位,并尝试使用HotSpot和JRockit.Server具有Linux 2.6.18

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

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

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

/opt/jrockit-jdk1.6/bin/java -Xms512m -Xmx512m -Xss128k -jar JavaNatSimulator.jar /opt/tools/jnatclients/natSimulator.properties

我们尝试编辑/etc/security/limits.conf和ulimit,但仍然如此

[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
提问于
用户回答回答于

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

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

用户回答回答于

这不是内存问题,而是操作系统资源问题。您正在用尽本机线程,即操作系统允许您的JVM使用多少个线程。

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

如果可能的话,您可以考虑在Executor的控制下重写使用Callable / Runnables。有很多具有各种行为的标准执行程序,您的代码可以轻松控制。

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

扫码关注云+社区

领取腾讯云代金券