Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jvm是否可以配置为考虑周全,并与其他进程共享计算资源(CPU和RAM)?_Java_Memory_Jvm_Cpu Usage_Single Threaded - Fatal编程技术网

Java jvm是否可以配置为考虑周全,并与其他进程共享计算资源(CPU和RAM)?

Java jvm是否可以配置为考虑周全,并与其他进程共享计算资源(CPU和RAM)?,java,memory,jvm,cpu-usage,single-threaded,Java,Memory,Jvm,Cpu Usage,Single Threaded,我正在运行用Java或Scala编写的现有程序。这些程序是由不同的作者编写的,并且服务于非常不同的目的,因此将它们集成到一个大型程序中是不可行的。当这些java程序中的任何一个在具有多个内核(例如32个)和多个RAM(例如200G)的节点上启动时,每个程序都会尝试占用尽可能多的资源,以至于节点速度减慢到停止,并且没有进行任何有用的计算。例如,在不同的数据集上运行的32个实例会导致32个JVM,每个JVM都尝试使用32个内核和大部分内存。(Beagle未配置为使用默认值nthreads=1进行显式

我正在运行用Java或Scala编写的现有程序。这些程序是由不同的作者编写的,并且服务于非常不同的目的,因此将它们集成到一个大型程序中是不可行的。当这些java程序中的任何一个在具有多个内核(例如32个)和多个RAM(例如200G)的节点上启动时,每个程序都会尝试占用尽可能多的资源,以至于节点速度减慢到停止,并且没有进行任何有用的计算。例如,在不同的数据集上运行的32个实例会导致32个JVM,每个JVM都尝试使用32个内核和大部分内存。(Beagle未配置为使用默认值
nthreads=1
进行显式多线程处理。)

所以,我如何配置jvm,使其行为更像一个只使用它真正需要的内存和CPU的传统程序

我知道下面的旗帜,但还有其他的标志要考虑吗?

-Xmx限制最大内存
-XX:+UseSerialGC禁用多线程垃圾收集

jvm真的是单线程的吗

此外,相当轻量级的java程序都尝试在一个节点上使用至少30G的RAM和200G的RAM,而实际上它们只需要这些RAM
-XX:-UseSerialGC

这将禁用串行GC,这与您想要的相反

我在一个没有根访问权限的环境中工作

如果内核是使用用户名称空间编译的,则可以使用
unshare
输入新的用户名称空间,然后使用该名称空间中的cgroup来限制资源

-XX:-UseSerialGC

这将禁用串行GC,这与您想要的相反

我在一个没有根访问权限的环境中工作

如果内核是使用用户名称空间编译的,则可以使用
unshare
输入新的用户名称空间,然后使用该名称空间中的cgroup来限制资源

jvm真的是单线程的吗

不,当它可以并发运行时,它会。您可以使用taskset将JCVM限制为仅一个CPU字节,如果这样做,它的性能将非常差,因为它确实需要多个CPU

有没有比设置严格的内存上限更优雅的解决方案

我会试着确定你的意思

为什么jvm不能使用它实际需要的那么多呢

它需要多少CPU和内存就用多少

当新进程不断启动时,nice+10 java可能会遇到麻烦

启动新的JVM所产生的开销远远大于收益。如果您想节省CPU,我会尽可能少地启动JVM

jvm真的是单线程的吗

不,当它可以并发运行时,它会。您可以使用taskset将JCVM限制为仅一个CPU字节,如果这样做,它的性能将非常差,因为它确实需要多个CPU

有没有比设置严格的内存上限更优雅的解决方案

我会试着确定你的意思

为什么jvm不能使用它实际需要的那么多呢

它需要多少CPU和内存就用多少

当新进程不断启动时,nice+10 java可能会遇到麻烦


启动新的JVM所产生的开销远远大于收益。如果您想节省CPU,我会尽可能少地启动JVM。

我不知道,但android已经在进程之间共享RAM,我不知道这是否相关,但可能是:)您可以使用其命令行选项(nthreads)控制Beagle。惊奇:阅读您使用的软件的文档会有帮助。@Durandal Beagle的
nthread
默认值为1,因此默认情况下它应该以单线程运行。事实上,我使用的Beagle版本不支持多线程。我联系了作者关于Beagle接管所有内核的事,他坚持我使用的Beagle版本是严格的单线程版本。重要的是,我只是以比格犬为例。其他程序的CPU使用率也可能超过100%,这可能是由于多线程垃圾收集造成的。问题的一部分是jvm是否会在其他任务中使用多线程,以及如何禁用它。它只使用已经需要的内存和CPU。使用
-Xmx
只设置它在使用OOME死亡之前将使用的最大内存。我不知道,但android已经在进程之间共享RAM,我不知道这是否相关,但可能是:)您可以使用其命令行选项(nthreads)控制Beagle。惊奇:阅读您使用的软件的文档会有帮助。@Durandal Beagle的
nthread
默认值为1,因此默认情况下它应该以单线程运行。事实上,我使用的Beagle版本不支持多线程。我联系了作者关于Beagle接管所有内核的事,他坚持我使用的Beagle版本是严格的单线程版本。重要的是,我只是以比格犬为例。其他程序的CPU使用率也可能超过100%,这可能是由于多线程垃圾收集造成的。问题的一部分是jvm是否会在其他任务中使用多线程,以及如何禁用它。它只使用已经需要的内存和CPU。使用
-Xmx
只设置它在使用OOME死亡之前将使用的最大内存。根据,
-XX:-UseSerialGC
使用串行垃圾收集。
cgroups
选项很有趣(尽管我很确定我们使用的是一个库存内核)。它实际上与
ulimit
不同吗?该表仅描述了选项,选项是否打开取决于+/-。在上表的散文中提到:“布尔选项是用-XX:+打开的,用-XX:-关闭的。”我明白了。我误解了这个表。根据,
-XX:-UseSerialGC
使用串行垃圾收集。
cgroups
选项很有趣(尽管我很确定我们使用的是一个股票内核)。它实际上与ulimit不同吗