设置-XX:MaxRam

时间:2018-09-25 09:59:13

标签: java performance memory jvm jvm-hotspot

根据此link,有一个选项可以手动设置MaxRamSize,以限制JVM不再使用超出此范围的内存。但是我没有看到相同的任何文档。我从来不知道有没有类似或类似的东西? PS。我知道,我不想设置堆/堆栈/元空间/本机内存大小。我只是想知道是否有整体内存限制选项。

尝试它没有帮助,因为它出错了:

Improperly specified VM option 'MaxRAM=1073741824B'
Could not create the Java Virtual Machine.
A fatal exception has occurred. Program will exit.

根据link open-jdk的事实似乎具有这些选项。 我发现我相信另一个link指向设置堆大小。再次找不到。但这是给Oracle的。

为什么我要寻找这种选项来在容器中运行应用程序(如Docker),并防止应用程序被OOM Killer杀死。我相信的是,如果有这样的Java应用程序设置,则会因java.lang.OutOfMemoryError错误或崩溃而不是终止容器。

我的假设和理解可能是完全错误的。 这个问题也可能是完全错误和无关紧要的。但是,当然,问问是前进的方向:)。

3 个答案:

答案 0 :(得分:2)

我认为java抱怨“ B”。根据手动输入,java命令可理解k / Km / Mg / G后缀用于尺寸。它没有提到“ B”。

(您是否注意到错误消息显示“指定不正确”而不是“未知”?这暗示java命令已识别该选项,但语法不正确。请参见上文...)< / p>

查看Java 11的OpenJDK源代码,我可以看到在“ gc_globals.hpp”文件中定义的MaxRAM参数。

答案 1 :(得分:1)

我找到了参考

https://chriswhocodes.com/hotspot_options_jdk11.html?s=MaxRam

但是正如Stephen C所建议的,它可能只是B

注意:这是用于计算默认堆和直接内存最大值的最大RAM大小。它不会提供更大的执行力。

  

用于设置最大堆大小的实际内存大小(以字节为单位)

和另一个参数

  

根据人体工程学设置的最大堆大小(以字节为单位); [默认]零表示使用MaxRAM * MaxRAMPercentage / 100


在Oracle / OpenJDK中,没有明显的选择。

$ java -version -XX:+PrintFlagsFinal | grep -i MaxRAM

但是,在Linux上,您可以使用ulimit设置最大内存大小,但是如果达到该大小,将使JVM崩溃。

答案 2 :(得分:1)

  

为什么我要寻找这种选项来在容器内运行应用程序(如Docker),并防止应用程序被OOM Killer杀死。

这正是您要寻找的选项。此外,它已作为JDK-8170888的一部分与 "domain": "notifications", "description": "Notifications", "attributes": { "attribute": "scheduled_medication", "description": "Scheduled Medication", "values": { "type": "delivery_method", "value": "push" } } } (〜docker)正确集成。 请注意,此标志不会阻止JVM分配比其值更多的内存,而是提示“我知道我的物理RAM限制为X,请在X内分配”,因此JVM将在Java堆和本机内存之间共享此值。但是如果您的应用程序有本机内存泄漏或类加载器泄漏,那么无论如何都会达到此限制。

JVM在cgroups上抱怨,因为它最终不希望MaxRAM=1073741824B,因此应将其声明为B。 请参见标志-XX:MaxRAM=1073741824的{​​{3}}。