首页 > 解决方案 > Fedora 30 和 OpenJDK 1.8.0_212:java.lang.OutOfMemoryError:无法创建新的本机线程

问题描述

我不明白为什么我的带有 12 GB RAM 的 Fedora 30 64 位在使用 Java 8 应用程序创建超过 10.000 个线程时会出现问题。

我需要创建很多线程,因为 Java 应用程序是一个模拟器,我无法更改 Java 代码的实现中的任何内容。

我使用 64 位 OpenJDK 来限制带有“Xss”选项的线程的堆栈大小:

openjdk version "1.8.0_212"
OpenJDK Runtime Environment (build 1.8.0_212-b04)
OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)


java  -Xmx3500m -Xss228k -jar Uni.jar

我试图理解为什么 Fedora Linux 操作系统没有分配超过 10.000 个线程,但什么也没分配。任何参数似乎都是正确的并且超过 10k 阈值。

core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 47765
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 47765
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

$ cat /proc/sys/kernel/pid_max
32768
$ cat /proc/sys/kernel/threads-max
95530

我在这里查看了很多帖子,但任何建议的解决方案都不起作用,我想它可能与 Fedora 30 或我使用的 JVM 版本有关。

有什么提示吗?

===== 编辑 ====

Java 代码非常简单,因为我有:

new Thread()
{
 ...
}

相同的代码在 Windows 10 中运行良好!

当 Fedora Linux 内存达到 10.000 个线程并引发错误时,内存约为 1.5GB。

===== 编辑 ====

我用一个简单的 C 程序模拟了相同数量的线程,该程序在这台 Fedora linux 机器上分配了 12K 线程,在 10K 之后出现错误“资源暂时不可用”。

所以问题与 Java 无关,而与 Linux 设置有关。

标签: javamultithreadingfedora

解决方案


推荐阅读