【发布时间】:2016-11-02 22:46:51
【问题描述】:
我正在运行用 Java 或 Scala 编写的现有程序。这些程序由不同的作者编写并且服务于非常不同的目的,因此将它们整合到一个大型程序中是不可行的。当这些 java 程序中的任何一个在具有许多内核(例如 32)和大量 RAM(例如 200G)的节点上启动时,每个程序都会尝试占用尽可能多的资源,以至于节点减速到停止并且没有有用的计算完成。例如,在不同的数据集上运行 32 个 Beagle 实例会导致 32 个 jvm 尝试使用 32 个内核和大部分内存。 (Beagle 未配置显式多线程,默认使用 nthreads=1。)
那么我该如何配置 jvm 使其表现得更像一个传统程序,只使用它真正需要的内存和 CPU...
我知道以下标志,但还有其他标志需要考虑吗?
-Xmx limits maximum memory
-XX:+UseSerialGC disables multithreaded garbage collection
jvm真的可以单线程吗?
此外,相当轻量级的 java 程序都试图在具有 200G RAM 的节点上使用至少 30G 的 RAM,而实际上它们只需要 -Xmx1G,这些程序运行时没有错误或明显的性能下降;事实上,启动时间要快得多。
有没有比设置内存上限更优雅的解决方案?如果我将-Xmx 设置得太低,程序就会崩溃。如果我将其设置得太高,则会浪费资源。使用由谨慎的作者编写的 C++ 编写的程序,我不需要调整这些东西。 C++ 程序的内存使用量通常会随着输入数据的大小而变化。
为什么 jvm 默认不能使用它实际需要的那么多?
除了nice和ulimit,还有更好的解决方案吗?
nice +10 java 在以更高优先级连续启动新进程时可能会遇到麻烦。
ulimit java 会导致 jvm 崩溃。
我在没有 root 访问权限的环境中工作。我不是在 Linux 服务器上工作,也不是在 Android 上工作。
【问题讨论】:
-
我不知道,但android已经在进程之间共享RAM,我不知道这是否相关但可能是:)
-
您可以使用 Beagle 的命令行选项 (nthreads) 来控制它。惊喜:阅读您使用的软件的文档会有所帮助。
-
@Durandal Beagle 的
nthread默认为 1,因此默认情况下它应该在单线程中运行。其实我用的Beagle版本是不支持多线程的。我联系了作者关于 Beagle 接管所有内核的事情,他认为我使用的 Beagle 版本是严格单线程的。重要的是,我只以 Beagle 为例。其他程序的 CPU 使用率也可能超过 100%,这可能是由于多线程垃圾收集。部分问题是 jvm 在其他任务期间是否会多线程以及如何禁用它。 -
它只使用它所需要的内存和 CPU。使用
-Xmx只设置它在 OOME 死前将使用的最大内存。
标签: java memory jvm cpu-usage single-threaded