Java 设置-XX:MaxRam

Java 设置-XX:MaxRam,java,performance,memory,jvm,jvm-hotspot,Java,Performance,Memory,Jvm,Jvm Hotspot,根据这一点,可以选择手动设置MaxRamSize,以限制JVM不使用超出此范围的内存。但我没有看到任何相同的文件。我从来都不知道这件事。有这样或类似的东西吗? 另外,我知道,我不想设置堆/堆栈/元空间/本机内存大小。我只是想知道是否有一个整体的内存限制选项 尝试它没有帮助,因为它出错了: Improperly specified VM option 'MaxRAM=1073741824B' Could not create the Java Virtual Machine. A fatal ex

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

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

Improperly specified VM option 'MaxRAM=1073741824B'
Could not create the Java Virtual Machine.
A fatal exception has occurred. Program will exit.
事实上,根据这个开放的jdk似乎有这些选项。 我发现的另一个方法是设置堆大小。这也不是我想要的。但我想这是给甲骨文的

为什么我要寻找这样一个选项来在容器(比如Docker)中运行应用程序,并防止应用程序被OOM杀手杀死。我认为,如果存在这样的设置,java应用程序将出现错误或崩溃,而不是终止容器

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

我找到了参考资料

但正如Stephen C所说,这可能只是
B

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

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

对于另一个参数

按人体工程学设置的最大堆大小(字节);[默认值]零表示使用MaxRAM*MaxRAMPercentage/100


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

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

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

我认为
java
正在抱怨“B”。根据手动输入,
java
命令理解
k
/
k
m
/
m
g
/
大小后缀。它没有提到“B”

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

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

为什么我要寻找这样一个选项来在容器(比如Docker)中运行应用程序,并防止应用程序被OOM杀手杀死

这正是您正在寻找的选项。此外,它还与
cgroups
(~docker)进行了适当的集成,作为。 请注意,此标志并不阻止JVM分配超过其值的内存,而是提示“我知道我的物理RAM限制为X,请在X内分配”,因此JVM将在Java堆和本机内存之间共享此值。但是,如果应用程序存在本机内存泄漏或类加载器泄漏,则无论如何都会达到此限制

JVM正在抱怨
MaxRAM=1073741824B
,因为它最终不希望
B
,它应该声明为
-XX:MaxRAM=1073741824

请参阅标记的内容:
用于设置最大堆大小的实际内存大小(以字节为单位)

我也有同感。但我不知道这是因为你应该为
MaxRAM
:)一天的结束而祈祷,-XX:MaxRAM没有阻止OOM Killier终止应用程序进程。@VipinMenon同意,它只设置用于进一步计算的值。它本身并不强制执行。使用
ulimit
将导致进程在未调用OOM killer的情况下死亡。如果您想使用
ulimit
(RLIMIT\u RSS)限制Linux上的驻留内存,那么它没有任何效果:ulimit只能限制虚拟内存(RLIMIT\u AS),但这几乎没有什么用处。是的,这两个标志的作用也如中所建议的那样,即这仅适用于堆??它确实是堆的大小,但使用(另一个)标志
MaxHeapSize
稍微调整。它并不限制运行时消耗更多内存(要做到一致并不容易),而是给运行时一个提示。如果您看到意外的峰值,我建议您使用-XX:NativeMemoryTracking=“…”跟踪应用程序本机内存