根据此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
错误或崩溃而不是终止容器。
我的假设和理解可能是完全错误的。 这个问题也可能是完全错误和无关紧要的。但是,当然,问问是前进的方向:)。
答案 0 :(得分:2)
我认为java
抱怨“ B”。根据手动输入,java
命令可理解k
/ K
或m
/ M
或g
/ 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}}。