java - 尝试在高内存、多 CPU 服务器上运行多个调用时 JVM 崩溃

标签 java jvm multiprocessing

我编写了一些基于 Java 的单线程基因组学软件,一次只处理一个样本,而且我有数百个样本要处理。我可以访问一台有 64 个 CPU 和 1 TB RAM 的机器,并且系统上没有其他用户。每次调用请求的最大堆大小为 8 GB。我希望我应该能够同时调用我的代码的 30 个实例(假设有两个线程——我的主线程和一个 GC 线程?)。我一次只尝试发送 20 个(使用 makefile 和 -j20 参数)。然而,在实践中,只有 5 次运行。其余的失败并显示消息:

# There is insufficient memory for the Java Runtime Environment to continue.
# Cannot create GC thread. Out of system resources.

我怀疑这更多地与同时调用有关,而不是实际资源限制,因此我在我的程序每次调用的执行循环中实现了随机几秒的延迟。这使我最多可以同时运行 10 个程序,而不是 5 个,并显示相同的失败消息。

问题:

  1. 为什么尝试以这种方式同时调用数十个 JVM 实例会失败,尽管在显然具有可用资源的系统上这样做?

  2. 为什么我的 hack 实现调度延迟解决了一些问题?

  3. 让所有 20 个实例同时运行的更好方法是什么?

最佳答案

默认收集器是多线程的,其线程数根据 CPU 核心数进行缩放。如果您一次运行许多 Java 实例并且每个实例只有一个线程,您可能希望切换到串行收集器,这将消耗更少的线程和线程堆栈的虚拟内存。

此外,JVM 预先保留了大量虚拟内存,可能比它在其生命周期内实际需要的更多。因此,您应该启用交换并允许过度使用以避免资源耗尽。

关于java - 尝试在高内存、多 CPU 服务器上运行多个调用时 JVM 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35275289/

相关文章:

java - 当在 java 中的关闭钩子(Hook)内抛出异常时会发生什么

java - 为什么 Maven 在 lib 目录中寻找一个 Artifact 而不是我正在运行它的 Artifact ?

java - JNI 崩溃 JVM - Java 运行时环境 : EXCEPTION_ACCESS_VIOLATION 检测到 fatal error

python - Python 中的多重处理并不比顺序处理快

python - multiprocessing.dummy 为什么 AttributeError : 'module' object has no attribute 'dummy'

java - 如何将文本设置为整数并获取 int 而不会出错

java - 如何在多个 Struts 2 操作类中获取存储的 session 值?

java - 从数据库获取最新数据到jsp页面

java - 在二进制文件的某个位置写入字节

python - 使用 pexpect 和多处理时出错?错误 "TypError: cannot serialize ' _io.TextIOWrapper 对象”