2008-10-15 11 views
12

Ich bin neugierig, was die genaue Bedeutung von "committed" Speicher ist, wenn der Wert von der MemoryUsage-Klasse abgefragt wird. Diese Klasse erklärt es als "committed" stellt die Speichermenge (in Byte) dar, die garantiert für die Verwendung durch die Java Virtual Machine verfügbar ist. " Bedeutet dies, dass der Speicher vom jvm-Prozess verwendet wird und anderen Prozessen nicht zur Verfügung steht, bis er durch den Java-Prozess freigegeben wird, oder bedeutet dies, dass der Java-Prozess erfolgreich ist, wenn er versucht, diese Menge an Speicher zuzuweisen ? Mir ist klar, dass dies implementationsspezifisch sein könnte, aber ich bin nur an Hotspots interessiert.Exakter Status des festgeschriebenen Speichers in Java

Antwort

20

Die festgeschriebene Größe ist der tatsächlich zugewiesene Speicher, die verwendete Größe ist die Größe, die zum Speichern der tatsächlichen Daten verwendet wird (wenn verwendet ~ = festgeschrieben, ist es Zeit für den Haupt-GC und möglicherweise den Heap). Die Max-Größe ist die harte Grenze, auf die der Heap wachsen kann - wenn es nicht genug ist, wirft die JVM OutOfMemoryError.

Wenn ein Speicher festgeschrieben ist, kann er definitiv verwendet werden. Außerdem ist die einzige Gelegenheit, wenn JVM nicht in der Lage wäre, mehr Speicher (auf einem modernen Betriebssystem) zu binden, wenn die Hardware nicht im virtuellen Speicher ist.

Alle diese Größen sagen nur die Größe der Heap-Region. Die JVM hat auch andere Speicherbereiche (Thread-Stapel, JIT-Cache, etc.). Die Heap-Region ist normalerweise am größten, dies entspricht in etwa dem Prozess-Footprint.

Zwei Anmerkungen:

  • wenn die engagierte Größe im physikalischen Speicher nicht paßt, werden Teile davon in die Auslagerungsdatei ausgetauscht werden. Dies führt zu einer großen Verlangsamung während des GC und in solchen Fällen verbessern Sie die Anwendungsleistung, indem Sie die Größe des Heapspeichers reduzieren.
  • einige Betriebssysteme erlauben doppelte Buchung von Speicher - Sie so viel wie Sie wollen, solange Sie es nicht benutzen versuchen zuordnen können (vergessen, welches Betriebssystem es war - mir jemand ausfüllen)
+2

Mindestens Linux kann diese Doppelbuchung machen; es heißt "overcommit". http://opsmonkey.blogspot.com/2007/01/linux-memory-overcommit.html – sleske

+0

"Die festgeschriebene Größe ist der tatsächlich zugewiesene Speicher, die verwendete Größe ist die Größe, die zum Speichern der tatsächlichen Daten verwendet wird (bei Verwendung von ~ = Committed es ist Zeit für Major GC und möglicherweise den Heap wachsen.) Die Max-Größe ist die harte Grenze, auf die der Heap wachsen kann - wenn es nicht genug ist, wirft die JVM OutOfMemoryError. " für mich bedeutet dies, dass irgendwann OutOfMemoryError (es hängt von Max-Wert von Heap, -Xmx) –

2

"Bedeutet dies, dass der Speicher vom jvm-Prozess verwendet wird und anderen Prozessen NICHT zur Verfügung steht" wäre der richtige. Also ist es kleiner als die Menge an Speicher, die das Betriebssystem als vom JVM-Prozess genommen sieht.

http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html (Es tut uns leid, keine Anker zu verknüpfen).

Verwandte Themen