Und allgemein werden die Einheiten für die Optionen -Xmx
, -Xms
und -Xmn
("k", "M" und "G" oder die weniger Standardmöglichkeiten "K", "m") verwendet. oder "g") Binärpräfix Multiples (dh Potenzen von 1024), oder sind das Potenzen von 1000?
Die Handbücher geben an, dass sie Kilobyte (kB), Megabyte (MB) und Gigabyte (GB) repräsentieren, was darauf hindeutet, dass sie 1000er Potenzen sind, wie im ursprünglichen SI System. Meine informellen Tests (von denen ich nicht sehr überzeugt bin) legen nahe, dass sie wirklich kibibytes (kiB) , Mebibytes (MiB) und gibibytes (GiB) , alle Potenzen von 1024.
Also, was ist richtig? Z.B. Welcher Java-Code würde die aktuelle Größe anzeigen?
Die Verwendung von Vielfachen von 1024 ist für RAM-Größen nicht überraschend, da RAM normalerweise durch das Verdoppeln von Hardware-Modulen physikalisch ausgelegt wird. Die Verwendung von Einheiten in einer klaren und standardisierten Weise ist jedoch immer wichtiger, da wir zu immer größeren Mächten gelangen, da das Potenzial zur Verwirrung wächst. Die Einheit "t" wird auch von meiner JVM akzeptiert, und 1 TiB ist 10% größer als 1 TB.
Hinweis: Wenn es sich wirklich um binäre Vielfache handelt, schlage ich vor, die Dokumentation und die Benutzeroberflächen zu aktualisieren, um Beispiele zu geben. Beispiele: " Den Buchstaben k oder K anfügen, um kibibytes (1024 bytes) oder m anzugeben oder M, um Mebibytes anzugeben (1048576 Byte) ". Dies ist der Ansatz, der beispielsweise in Ubuntu verwendet wird: UnitsPolicy - Ubuntu Wiki .
Hinweis: Weitere Informationen darüber, wofür die Optionen verwendet werden, finden Sie z. java - Was sind die Parameter Xms und Xmx beim Start von JVMs? ? .
Kurze Antwort: Alle Speichergrößen, die von den JVM-Befehlszeilenargumenten verwendet werden, werden in den traditionellen binären Einheiten angegeben, wobei ein Kilobyte 1024 Bytes und die anderen eine Potenz von 1024 haben.
Lange Antwort:
Diese Dokumentationsseite zu den Befehlszeilenargumenten sagt Folgendes gilt für alle Argumente, die Speichergrößen akzeptieren:
Um beispielsweise die Größe auf 8 GB festzulegen, können Sie entweder
8g
,8192m
,8388608k
oder8589934592
als Argument angeben.
Für -Xmx
gibt es diese spezifischen Beispiele:
Die folgenden Beispiele zeigen, wie die maximal zulässige Größe des zugewiesenen Speichers mit verschiedenen Einheiten auf 80 MB festgelegt wird:
-Xmx83886080
-Xmx81920k
-Xmx80m
Bevor ich überlegte, ob ich die Dokumentation überprüfen sollte (ich nahm an, dass Sie das schon getan hatten?), überprüfte ich die Quelle von HotSpot und fand heraus, dass die Speicherwerte in src / share / vm / runtime / arguments.cpp durch die Funktion atomull
(die scheint steht für "ASCII in den Speicher, unsigned long long"):
Diese Konstanten K
, M
, G
sind definiert in src / share / vm / utilities / globalDefinitions.hpp :
All dies bestätigt die Dokumentation, außer dass die Unterstützung für das Suffix T
für Terabytes später hinzugefügt wurde und überhaupt nicht dokumentiert ist.
Es ist nicht zwingend erforderlich, einen Einheitsmultiplikator zu verwenden. Wenn Sie also eine Milliarde Bytes möchten, können Sie -Xmx1000000000
schreiben. Wenn Sie einen Multiplikator verwenden, sind sie binär, also -Xmx1G
bedeutet 2 30 Bytes oder ein Stick von RAM.
(Was nicht wirklich überraschend ist, da Java dem Versuch der IEC vorausgeht, existierende Wörter rückwirkend neu zu definieren. Verwirrung hätte gespart werden können, wenn die IEC lediglich die Disambiguierung der Speichereinheiten mit den Qualifizierern "binär" und "dezimal" empfohlen hätte. manchmal war ihre Bedeutung nicht klar, zB binary gigabytes (GB 2 ) = 1024 3 Bytes und dezimale Gigabyte (GB 10 ) = 1000 3 Bytes Aber nein, sie definierten die Wörter, die alle bereits verwendeten, unweigerlich explodierende Verwirrung und ließen uns mit diesen Clowns stecken Begriffe "gibibyte", "tebibyte" und der Rest. Oh Gott, verschone uns.)
Sie haben zwei Möglichkeiten, um eine Antwort auf Ihre Frage zu erhalten:
a) Inspizieren Sie den Quellcode von JDK. Leider konnte ich in 5 Minuten nicht googeln.
b) schreiben Sie eine Simulation, führen Sie sie mehrmals aus und machen Sie einige Beobachtungen.
%Vor%Und es mehrmals ausführen:
%Vor%Es ist also eine Vermutung, dass Java keine genaue Zahl verwendet, sondern eine 2 ^ n Annäherung an die von Ihnen angeforderte Zahl.
In einer weiteren Frage zum -Xmx
-Flag , Runtime.getRuntime().maxMemory()
wird verwendet, um die aktuelle Größe anzuzeigen. Es wird auch darauf hingewiesen, dass -Xmx1024m
und -Xmx1g
zu einer identischen Ausgabe führen, was darauf hinweist, dass die Zahlen Potenzen von zwei statt zehn sind.
Beachten Sie auch den Unterschied zwischen totalMemory()
und maxMemory()
.
Was sind Runtime.getRuntime (). totalMemory () und freeMemory ()?
Tags und Links java units-of-measurement