繁体   English   中英

Ubuntu 无法启动另一个 Java 线程

[英]Ubuntu can´t start another Java thread

我的问题是,我在启动 41 个线程的 ubuntu linux 服务器上有一个可执行文件 jar。 现在我想启动第二个 jar 文件,它创建了类似数量的线程,但它不起作用。 我收到错误:

java.lang.OutOfMemoryError: unable to create native thread: possibly out of memory or process/resource limits reached

即使当我尝试输入 java -version 时,我也会收到此错误。 我查看了我的 memory 限制,它只使用了 10% 的内核和 2 个 8GB 内存。

当我输入 ulimit -a 我得到每个用户 62987 个进程

当我查看 /proc/sys/kernel/pid_max 时,我得到了 32768。

我不知道我应该做什么有人可以帮助我吗?

我的问题是,我在启动 41 个线程的 ubuntu linux 服务器上有一个可执行的 jar 文件。 现在我想启动第二个 jar 文件,该文件创建了类似数量的线程,但它不起作用。 我得到错误:

java.lang.OutOfMemoryError: unable to create native thread: possibly out of memory or process/resource limits reached

即使我尝试输入 java -version 我也会收到此错误。 我查看了我的 memory 限制,它只使用 10% 的内核和 2 个 8GB 内存。

当我输入 ulimit -a 时,每个用户有 62987 个进程

当我查看 /proc/sys/kernel/pid_max 时,我得到了 32768。

我不知道我该怎么做有人可以帮助我吗?

您的问题中没有足够的细节来给出明确的答案或解决方案。


问题几乎可以肯定不是操作系统对线程数施加的限制。 它很可能与 memory 相关。

你说 8GB RAM 中有 2GB 正在使用,但你没有说你是如何得到这个数字的。 有许多不同的方法可以衡量 memory 的使用情况,它们的含义也不同。

当一个 JVM 启动一个新线程时,它会去操作系统并请求一个 memory 的块来保存线程堆栈。 默认线程堆栈大小是特定于平台的,但通常为 1GB。 这可以通过 JVM 命令行选项进行修改,或者由应用程序使用具有堆栈大小参数的Thread构造函数进行修改。 请注意,堆栈段未分配在 Java 堆中。


所以这里有一些可能的解释。

一种可能是您正在运行 32 位 JVM。在 Linux 平台上,这会将您限制为 4GB 地址空间,而架构问题会将 JVM 限制为小于实际可用空间。 如果达到此限制,操作系统将拒绝 JVM 对堆栈段的请求。 (检查您是否安装了 64 位 Jave,并且没有提供-d32命令行选项。)

第二种可能性是您没有足够的交换空间。 如果操作系统有足够的物理 RAM交换空间(页面文件空间)来容纳该段,则它只会分配一个 memory 段。 如果它发现没有足够的空间来容纳当前正在运行的所有应用程序的所有页面,它将拒绝 JVM 对堆栈段的请求。

第三种可能性是您已经为 JVM 配置了一个非常大的堆,并且在系统级别保留了所有可用的虚拟 memory。

第四种可能性是您不小心使用-Xss配置了非默认堆栈大小。

最后一种可能性是您实际运行的线程数超过您认为的 41 个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM