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
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)
"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).
- 1. Ansicht des zugewiesenen Speichers
- 2. Löschen des lokalen Speichers
- 3. Größe des PNG-Speichers reduzieren
- 4. Einstellen des Speichers pro Zündstufe
- 5. Amazon Alexa: Wörter des Benutzers des Speichers
- 6. Ist Java PermGen Space Teil des gesamten VM-Speichers?
- 7. Freigeben des Speichers der Struktur in C
- 8. Verwenden des persistenten Speichers in BlackBerry
- 9. Kerndatenfehler nach dem Wiederherstellen des persistenten Speichers
- 10. Apache-Funke beim Zwischenspeichern des Speichers
- 11. MemoryStream to SecureString: Löschen des Speichers
- 12. Größe des lesbaren Speichers eines Prozesses ermitteln?
- 13. Ändern des Stack-Speichers von C-Programm
- 14. Was ist der Anfangswert des dynamischen Speichers
- 15. GuardMalloc führt zur Erschöpfung des virtuellen Speichers
- 16. Explosion des Speichers mit Std :: Map
- 17. Korrekte Verwendung des lokalen Chrome-Speichers Get
- 18. std :: allocator ausplanen Teil des Speichers
- 19. Actionscript Virtuelle Maschine 1 - Überprüfung des Speichers
- 20. Wie erhält man den Status des Speichers, der von einer App programmgesteuert verwendet wird?
- 21. setInterval mit exakter Zeitüberschreitung
- 22. Dump nur einen Teil des Speichers in VS 2005
- 23. Verwenden des internen Speichers aus einer Nicht-Aktivitätsklasse in Android
- 24. Wie man einen Teil des Speichers in ein Raster laden
- 25. Exakter Ausdruck Suche mit Lucene.net
- 26. Redux: Teil des Status als unmounten Komponente?
- 27. Status des Prozesses überprüfen
- 28. Functor Instanz des Status
- 29. Behandlung des UI-Status
- 30. Exakter dezimaler Datentyp für C++?
Mindestens Linux kann diese Doppelbuchung machen; es heißt "overcommit". http://opsmonkey.blogspot.com/2007/01/linux-memory-overcommit.html – sleske
"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) –