Die Verringerung der Speicherverbrauch in Java
Arbeitete ich mit einigen Projekten, in denen eine bessere Leistung und die Verringerung der Speicherverbrauch wurde das primäre Ziel. Aber glauben Sie mir, es hat schon hart zu Steuern, ist der Speicherverbrauch in Java.
Diese wiki-Seite, sagt auf "Java Programm Geschwindigkeit"
Java ist in einigen Fällen gleich C++ auf low-level-und numeric-benchmarks.
Diese Statistik nicht wirklich zeigen einen großen Unterschied in der Zeit-Berechnung Performance-benchmark.
Jedoch, der Speicherverbrauch in Java ist ziemlich höher als C++, da gibt es ein 8-byte-overhead für jedes Objekt und 12 byte für jedes array in Java (32-bit; doppelt so viel in der 64-bit-java) wie bereits in obigem wiki-link.
Nun ist die Frage,, was alle Maßnahmen, die Menschen ergreifen, um minimieren Sie den Speicherverbrauch in Java?
Bitte beachten Sie, dass ich bin sehr besorgt über das Gedächtnis als die Leistung, denn ich kann mir nicht vorstellen, dass es eine bessere Weise als "bessere Programme schreiben" und "richtig tuning memory in JDK"
- Sie können nicht optimieren Sie Speicher-footprint als auch in java wie in c++. Wenn der Speicher ist die wichtigste Einschränkung, gibt es einen Grund, müssen Sie java?
- Java verwendet 4 bytes für den header eines Objekts in einer 64-bit-Programm, das ist nicht doppelt. Java verwendet in der Regel 32-bit-Referenzen für bis zu 32 GB in einem 64-bit-JVM, während C/C++ - 64-bit-Programme verwenden in der Regel 64-bit-Zeiger.
- +Anshu Java-Philosophie nicht wirklich interessiert, wie viel RAM verwendet Wird, der big point für Java ist die Skalierbarkeit, performance und Standardisierung, Wenn Sie etwas wollen, mit der die meisten Java Vorteile, aber leicht prüfen, werfen Sie einen Blick auf GOLANG, dass ist die Mitte zwischen Java und C++
- Wenn richtig konfiguriert, JVM kann vertikal skaliert, die Speichernutzung zu optimieren, um die aktuelle Last. Die ausgewählten garbage collector ist eines der wichtigsten Gründungsdokumente der Ziegel und seine Einstellungen können Einfluss auf das gesamte Projekt. Verwenden Sie G1 GC und vermeiden Sie "aggressiv-heap" - Ansatz. Weitere Einzelheiten sind in dem Artikel "Minimieren Java-Speicherbelegung mit der Rechten Garbage Collector" javacodegeeks.com/2017/11/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Je nach dem, was Sie arbeiten, können Sie profitieren von verschiedenen Programmiertechniken wie z.B.:
Es gibt nicht viel Sie tun können, über das Gedächtnis andere als die Verringerung der Anzahl der Objekte, die Sie erstellen und versuchen, machen Sie Ihr Objekt kurz-live. Jedoch, Java wird immer noch alle der Speicher es erlaubt ist, für die beste Leistung.
Betrachten Sie kleine benchmarks eher als Mikro-tests, wie groß ein array ist.
Können Sie versuchen, Vergleich von Java-Referenzen (verwendet 4-Byte auch auf einem 64-JVM) zu C++ - shared-Pointer (für die die 48-Byte auf einem 64-bit-Prozess) und kommen zu einem gewissen Abschluss ist unwahrscheinlich, nützlich zu sein in einem echten Programm.
Regel alles, was Sie tun müssen, ist einen memory-profiler. Dies wird Ihnen helfen, minimieren Sie den Speicherverbrauch in Java.
Finde ich diese obsession mit sparen jedes byte ist ein Anachronismus in den meisten Fällen. In einem PC, ein byte Speicher kostet rund 5e-7 Cent. Oder etwa 2e-6 Sekunden Zeit. Diese kann sich aber, wenn Sie nur sparen 100 KB ist, kann es nicht Wert sein, um änderungen am Programm-code, es zu tun, und wenn Sie zum speichern von 1 GB, kann es sich lohnen, die Ausgaben ein paar Stunden auf ihn. Auch wenn Sie tun, speichern von 1 GB, der Speicher ist wiederverwendbar, aber Ihre Zeit ist nicht.
Ich Stimme mit diesem Punkt, dass, wenn Sie ein Gerät mit ein paar MB, also kleiner als android-Handy zum Beispiel C würde Ihre beste Wahl sein. Wenn Sie ein Gerät haben, welches mindestens ein smart-phone-Kapazität, kann es sein, dass Java ist in Ordnung für Ihre Bedürfnisse.
Kann es zwei motivation für die Speicherverwaltung in java.
1. Vermeidung von häufigen anlegen/löschen von Objekten.
Dies wiederum vermeidet GC vom aufwachen bis sehr oft, da dies kann dazu führen, dass einer oder mehrere deiner threads zu sperren.
Vermeiden temporäre/permanente Speicher, Löcher
2. Reduzieren Sie den gesamten Speicherverbrauch der VM
Diese wird nötig sein, wenn der VM ausgeführt werden, in einer Umgebung, wo Sie haben strenge Speicher-Einschränkungen.
Idealerweise aus dem Gedächtnis Sicht ein gut geschriebenes java-Programm sollten versuchen, und erreichen beide der oben genannten.
Jetzt zu erreichen 1 sollten Sie das folgende tun.
Bevorzugen statische Speicherzuordnung, ich.e zuordnen, einmal pro VM als Gegensatz
um die dynamische Speicherverwaltung.
Vermeiden Sie die Erstellung von temporären Objekte innerhalb von Funktionen, um dies zu tun die meisten
Objekte implementieren können, eine reset () - Methode können Sie das Objekt an
wiederverwendet
Verstehen, welche API Sie verwenden, zB. wenn Sie eine Zeichenfolge verwenden, werden Sie
am Ende erstellen Sie so viele Instanzen, wie es änderungen. Die
dasselbe gilt für auto-boxed-Typen.
Den oben genannten Punkten auch Hilfe bei der Verwaltung oder dem controlling Punkt 2
Kontrollieren VM-Speicher-Größe, die Sie benötigen, zu tun, die oben genannten Punkte und auch die folgenden
Verwenden Xmx und Xms-flags beim Start der VM und bewusst Ihre Werte zu niedrigeren Werten als das, was gebraucht werden könnte, und auf der Suche von OutOfMemoryError .
Wenn OutOfMemoryError passiert, was bedeutet, dass Sie über die Dreharbeiten der max-VM-Größe. Identifizieren Sie, was ist die Ursache und starten Sie das tuning Ihrer Objekt-Erstellung.
Hoffe, es hilft ...