java - 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 设置有关。
解决方案
推荐阅读
- google-chrome-extension - 如何避免 chrome web 扩展中的跨域读取阻塞(CORB)
- react-native - 在 react native 中将完整的 android 项目导出到 iOS 的可能性
- firefox-developer-tools - 将选项卡堆栈跟踪的所有数据、Firefox DevTools 上网络面板的各种 HTTP 连接的所有数据保存在文件中?
- python-2.7 - 如何使用 pyqt4 将我的子小部件添加到树小部件
- amazon-web-services - 我是否应该获得 AWS 的(笔测试)批准才能对托管在 AWS 上的应用程序 API 进行模糊测试?
- c# - 为什么 async/await 在 UI 线程上恢复?
- javascript - Javascript - 干净的用户输入的货币价值
- bash - .bash_profile 文件发生一些更改后终端无法正常工作
- javascript - 来自 JSON 文件的 Javascript 中的父子树视图
- sql-server - 通过 RUNDECK 的作业执行包 SSIS 时出错