it-swarm.com.de

Einstellung -XX: MaxRam

Entsprechend diesem link gibt es eine Option, um MaxRamSize manuell festzulegen, um die JVM einzuschränken, um keinen Speicher darüber hinaus zu verwenden. Aber ich habe keine Dokumentation davon gesehen. Ich habe das noch nie gewusst. Gibt es so etwas oder ähnliches? PS. Ich weiß und ich suche nicht, um Heap/Stack/Metaspace/native Speichergrößen festzulegen. Ich möchte nur wissen, ob es eine allgemeine Speicherbegrenzungsoption gibt. 

Der Versuch hat nicht geholfen, da es fehlerhaft war:

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

Infact gemäß diesem link open-jdk scheint diese Optionen zu haben. . /. Ein anderes link , von dem ich glaube, dass es meiner Meinung nach Punkte gibt, um die Heapgröße festzulegen. Welches wiederum sucht nicht. Aber das ist für Oracle, denke ich.

Warum ich nach dieser Art von Option suche, um die Anwendung in einem Container (Like Docker) auszuführen und zu verhindern, dass die Anwendung vom OOM-Killer beendet wird. Was ich glaube ist, wenn die Java-Anwendung so eingestellt ist, dass der Fehler eher mit einem Java.lang.OutOfMemoryError abstürzt oder abstürzt, als der Container beendet wird. 

Meine Annahmen und mein Verständnis können völlig falsch sein. Diese Frage kann auch völlig falsch und irrelevant sein. Aber fragen ist natürlich der Weg nach vorne :). 

5
Vipin Menon

Ich denke, Java beschwert sich über das "B". Gemäß dem manuellen Eintrag versteht der Befehl Java die Suffixe k/K oder m/M oder g/G für Größen. "B" wird nicht erwähnt.

(Haben Sie festgestellt, dass in der Fehlermeldung "nicht korrekt angegeben" und nicht "unbekannt" angegeben ist?) Dies weist darauf hin, dass der Befehl Java die Option erkannt hat, die Syntax jedoch falsch ist. Siehe oben ...)

Beim Betrachten des OpenJDK-Quellcodes für Java 11 kann ich einen MaxRAM-Parameter sehen, der in der Datei "gc_globals.hpp" definiert ist.

2
Stephen C

Warum ich nach dieser Art von Option suche, um die Anwendung in einem Container (Like Docker) auszuführen und zu verhindern, dass die Anwendung vom OOM-Killer beendet wird.

Dies ist genau die Option, die Sie suchen. Darüber hinaus wurde es ordnungsgemäß in cgroups (~ docker) als Teil von JDK-8170888 ..__ integriert. Beachten Sie, dass dieses Flag die JVM nicht daran hindert, mehr Speicherplatz als ihren Wert zuzuweisen, sondern einen Hinweis "Ich weiß mein physikalisches RAM - Limit ist X, bitte innerhalb von X "zuordnen, daher teilt JVM diesen Wert zwischen Java-Heap und nativem Speicher auf. Aber wenn z. Ihre Anwendung hat einen nativen Speicherverlust oder einen Klassenladerleck, dann wird dieses Limit trotzdem erreicht. 

JVM beschwert sich über MaxRAM=1073741824B, da sie am Ende keine B erwartet, sondern als -XX:MaxRAM=1073741824 deklariert werden sollte. Siehe die Beschreibung der Flagge: Real memory size (in bytes) used to set maximum heap size.

1
qwwdfsad

Ich habe die Referenz gefunden

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

Aber wie Stephen C andeutet, ist es wahrscheinlich nur die B

ANMERKUNG: Dies ist die maximale RAM - Größe, die zur Berechnung des Standardmaximums für Heap- und Direktspeicher verwendet wird. Es bietet keine größere Durchsetzung.

Reale Speichergröße (in Byte), die zum Festlegen der maximalen Heap-Größe verwendet wird

und für einen anderen Parameter

Maximal ergonomisch eingestellte Heap-Größe (in Byte); [Voreinstellung] Null bedeutet MaxRAM * MaxRAMPercentage/100


Im Oracle/OpenJDK gibt es keine offensichtliche Option.

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

Unter Linux können Sie jedoch die maximale Speichergröße mit ulimit einstellen. Die JVM kann jedoch zum Absturz führen, wenn sie erreicht wird.

1
Peter Lawrey