【问题标题】:Ubuntu can´t start another Java threadUbuntu 无法启动另一个 Java 线程
【发布时间】:2020-09-07 05:17:27
【问题描述】:

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

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

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

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

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

我不知道该怎么办,有人能帮帮我吗?

【问题讨论】:

    标签: java multithreading ubuntu server


    【解决方案1】:

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


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

    您说 8GB 的​​ RAM 中有 2GB 正在使用中,但您没有说明您是如何获得这个数字的。衡量内存使用情况的方法有很多种,它们的含义也不同。

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


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

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

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

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

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

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

    【讨论】:

    • 感谢您的详细回答:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多