Verständnis Java Memory Management
Java-Programmierer wissen, dass die JVM läuft, ein Garbage Collector und System.gc() würde nur eine Anregung sein, um die JVM zum ausführen einer Garbage Collector. Es ist nicht unbedingt dass, wenn wir-System.gc(), würde er sofort laufen die GC.
Bitte korrigieren Sie mich, wenn ich falsch verstehen Java ' s Garbage Collector.
Ist/sind es andere/s Speicher-management andere, als sich auf Java Garbage Collector?
Wenn Sie beabsichtigen, die Frage zu beantworten, durch eine Art Programmierung der Praxis, die helfen würde, die Verwaltung der Speicher, so tun Sie dies bitte.
Für System.gc () - Hasser, bitte erklären, warum würden Sie hassen Aufruf von GC.
Haben Sie Lesen Sie diese Frage?
Sie sollten verlassen Sie sich nie auf dem System.gc() wie in einigen Umgebungen kann es nie aufgerufen werden. Sie können verhindern, dass software von außerhalb der vm zu tun.
Ich denke, es läuft darauf hinaus, das System.gc() aufrufen, nicht zuverlässig und nicht (immer) freigeben von Ressourcen, die freigegeben werden müssen, wenn Sie aufgerufen. Also, wenn Sie ein tool haben, Sie können sich nicht wirklich verlassen, es gibt nicht allzu viele Gründe für Sie, um es tatsächlich zu verwenden.
JVM hat malloc()'d eine bestimmte Menge an Speicherplatz im heap. Das Betriebssystem ist verpflichtet zu haben, die viel Arbeitsspeicher für die JVM. GC ist nicht von der Regel immer zu reduzieren, dass die Menge. Je nachdem, wie JVM konfiguriert ist, dass die Zahl nicht unter einen bestimmten Betrag, egal, wie wenig die tatsächlichen Objekte sind im Speicher. Moderne OS ist smart genug, um andere Prozesse zu benutzen, die realen physikalischen Speicher und gehören swap-space in der Berechnung der Summe vorbehalten für die JVM, aber wenn Sie in einer position, wo das Zeug ist ein Problem in den ersten place, es kann von Bedeutung sein.
Haben Sie Lesen Sie diese Frage?
Sie sollten verlassen Sie sich nie auf dem System.gc() wie in einigen Umgebungen kann es nie aufgerufen werden. Sie können verhindern, dass software von außerhalb der vm zu tun.
Ich denke, es läuft darauf hinaus, das System.gc() aufrufen, nicht zuverlässig und nicht (immer) freigeben von Ressourcen, die freigegeben werden müssen, wenn Sie aufgerufen. Also, wenn Sie ein tool haben, Sie können sich nicht wirklich verlassen, es gibt nicht allzu viele Gründe für Sie, um es tatsächlich zu verwenden.
JVM hat malloc()'d eine bestimmte Menge an Speicherplatz im heap. Das Betriebssystem ist verpflichtet zu haben, die viel Arbeitsspeicher für die JVM. GC ist nicht von der Regel immer zu reduzieren, dass die Menge. Je nachdem, wie JVM konfiguriert ist, dass die Zahl nicht unter einen bestimmten Betrag, egal, wie wenig die tatsächlichen Objekte sind im Speicher. Moderne OS ist smart genug, um andere Prozesse zu benutzen, die realen physikalischen Speicher und gehören swap-space in der Berechnung der Summe vorbehalten für die JVM, aber wenn Sie in einer position, wo das Zeug ist ein Problem in den ersten place, es kann von Bedeutung sein.
InformationsquelleAutor Michael Ardan | 2012-12-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die wichtigste Sache zu erinnern, über das Java memory management "zunichte machen" Ihre Referenz.
Nur Objekte, die nicht referenziert werden garbage Collection.
Beispielsweise Objekte in der folgende code ist nie gesammelt und deine Speicher werden voll nur nichts zu tun.
Aber wenn du keine Referenz auf diese Objekt ... können Sie die Schleife so viel, wie Sie möchten, ohne memory-problem.
Also, was immer Sie tun, stellen Sie sicher, Sie zu entfernen Referenz auf Objekt nicht mehr verwendet wird (Referenz setzen zu
null
oder klar-Sammlung).Wenn der garbage collector ausgeführt werden soll, ist am besten Links auf die JVM zu entscheiden. Gut, es sei denn, dein Programm ist zu starten, Dinge zu tun, die sehr viel Arbeitsspeicher und ist die Geschwindigkeit entscheidend, so dass Sie können vorschlagen, JVM ausführen, GC, bevor Sie in, wie Sie können wahrscheinlich bekommen die garbaged gesammelt und extra-Speicher, um auf zu gehen. Andere weisen, die ich persönlich sehe keinen Grund zu laufen
System.gc()
.Hoffe, dass dies helfen.
InformationsquelleAutor NawaMan
Unten ist die kleine Zusammenfassung, die ich schrieb zurück, in die Tage (ich habe es von einigen Blogs, aber ich kann mich nicht erinnern, wo aus - also keine Referenz, sorry)
-Xms
und-Xmx
wird verwendet, um setup zu starten-und max-Größe für den Java-Heap. Das ideale Verhältnis dieser parameter ist entweder 1:1 oder 1:1.5, basierend auf meiner Erfahrung, zum Beispiel, können Sie entweder beide–Xmx
und–Xms
als 1 GB –Xms-1,2 GB und 1,8 GB.Kommandozeilen-Optionen:
-Xms:<min size> -Xmx:<max size>
InformationsquelleAutor aviad
Nur um die Diskussion: Garbage Collection ist nicht die einzige form der Speicherverwaltung in Java.
In der Vergangenheit gab es Bemühungen zu vermeiden, die GC in Java bei der Implementierung der Speicherverwaltung (siehe Real-time-Spezifikation für Java (RTSJ)). Diese Bemühungen waren hauptsächlich gewidmet Echtzeit-und embedded-Programmierung in Java für die GC war nicht geeignet - wegen der performance-overhead-oder GC-eingeführt Latenz.
Die RTSJ Merkmale
RTSJ Vorteile:
Warum RTSJ fehlgeschlagen/nicht machen einen großen Einfluss:
Scoped Memory Code-Beispiel (aus Ein Beispiel Scoped Memory Nutzung):
Hier ein ScopedMemory-Implementierung genannt
LTMemory
ist reserviert. Dann einen thread betritt die scoped memory, teilt die temporären Daten, die erforderlich sind, nur während der Zeit der Berechnung. Nach dem Ende der Berechnung, der thread lässt die scoped memory, das sofort macht, den gesamten Inhalt der spezifischen ScopedMemory geleert werden. Keine Latenz eingeführt, erfolgt in konstanter Zeit z.B. vorhersehbare Zeit keine GC ausgelöst wird.Diese Konzepte sind bekannt seit 1999, so gab es genug Zeit für die Verabschiedung. Der Grund, warum Java nicht verwendet Game-Industrie ist das vermutlich anders - vielleicht-Plattform-Compiler und Game-engines sind immer noch entwickelt in C/C++.
Ich sehe. Vielen Dank Ales!
InformationsquelleAutor Ales
Aus meiner Erfahrung in java sollten Sie sich auf das memory-management, der von der JVM selbst.
Dem Punkt würde ich den Fokus in diesem Thema wird die Konfiguration in einer Art und Weise akzeptabel für Ihren Anwendungsfall. Vielleicht prüfen/Verständnis JVM-tuning-Optionen, die nützlich sein würde: http://docs.oracle.com/cd/E15523_01/web.1111/e13814/jvm_tuning.htm
InformationsquelleAutor Peter Butkovic
Können Sie nicht vermeiden, garbage collection, wenn Sie verwenden Java. Vielleicht gibt es einige obskure JVM-Implementierungen, die das tun, aber ich weiß nicht.
Ein richtig abgestimmter JVM sollte nicht jedes System.gc() Hinweise reibungslos funktionieren. Die genaue tuning würden Sie brauchen, hängt stark auf, was Ihre Anwendung tut, aber in meiner Erfahrung, die ich immer auf der concurrent-mark-and-sweep-option mit der folgenden Flagge:
-XX:+UseConcMarkSweepGC
. Dieses flag ermöglicht es der JVM, um die Vorteile der zusätzlichen Kerne in Ihrer CPU zu bereinigen, dead memory auf einem hintergrund-thread. Es hilft, um drastisch reduzieren die Menge der Zeit, die Ihr Programm mit Nachdruck angehalten werden, wenn dabei Müll-Sammlungen.Fanden diese nach ein bisschen googeln: javarevisited.blogspot.jp/2011/04/.... Es ist eine ziemlich gute übersicht, wie GC funktioniert in Java, enthalten eine Beschreibung der concurrent-mark-and-sweep. Die GC ist eine der besten Dinge über die Sprache. Nicht mehr (gut, vieles reduziert) manuelle Speicherverwaltung im Vergleich zu anderen Sprachen wie C++.
InformationsquelleAutor cambecc
Naja, die GC ist immer da-man kann nicht erstellen Sie Objekte, die sich außerhalb dessen zu erfassen (es sei denn, Sie nutzen die native Anrufe oder reservieren Sie einen direkten byte-Puffer, aber im letzteren Fall, Sie haben nicht wirklich ein Objekt, nur ein Haufen von bytes). Das heißt, es ist definitiv möglich, die zur Umgehung der GC durch die Wiederverwendung von Objekten. Zum Beispiel, wenn Sie müssen eine Reihe von
ArrayList
Objekte, Sie könnte einfach erstellen Sie jeweils ein, wie Sie es brauchen und lassen Sie die GC-handle memory management; oder Sie nennen könntelist.clear()
auf, nachdem Sie fertig sind mit es, und legen Sie es auf einige Warteschlange, wo jemand anderes es verwenden kann.Standard-best-practices sind nicht tun, die Art der Wiederverwendung, es sei denn, Sie haben guten Grund zu der (dh, Sie haben ein Profil erstellt und gesehen, dass die Zuweisungen + GC sind ein problem, und das wiederverwenden von Objekten behebt das problem). Es führt zu mehr komplizierten code, und wenn man es falsch kann es tatsächlich machen die GC ' s job schwieriger (weil, wie der GC Objekte verfolgt).
In den meisten Fällen, ja. Eine Anwendung, die ich auf Arbeit bin (java-basierte RDBMS) hat einen Fall, in dem die Wiederverwendung von Objekten hilft deutlich-wir wiederverwenden Zeilen, die wir vorher den cursor, und ein paar Millionen Zeilen, die es endet als ein großer Gewinn. Aber nochmal, wir wissen das, weil wir haben das profiling, um es zu beweisen.
Dann haben Sie zusätzliche Arbeit, die neben der reinen Zuweisung für ein Objekt wiederverwendbar sein.
Ja, das tun wir. Aber ich denke, dass ein Teil der Antwort, denn in der Praxis einem zugewiesenen Stück genullt out bytes ist nicht sehr nützlich. Um zu sparen, auf der anderen die Kosten, wir müssen auch die Treffer von "manuell" verwalten der Speicher-management.
Nein, ich meine, anstatt jede Zeile erstellt werden, wie
new Row(backingBytes)
und dann einfach Augen zu verlieren, dass die Zeile, wenn wir brauchen es nicht mehr (an diesem Punkt werde es sein förderfähigen für GC), schaffen wir es einmal und dann halten, ruftrow.init(backingBytes)
zu gehen, um die nächste Zeile. Aber der Punkt, den ich versuchte in meiner Antwort, und die Thorbjørn betonte, dass dies ein seltener Fall. In den meisten Fällen, Sie im Grunde müssen nur sicherstellen, dass eine GC root (im Grunde ein Thread oder Runnable) nicht zu halten auf Objekte mehr, die es braucht, um; der GC kümmert sich um den rest.InformationsquelleAutor yshavit
Prinzipiell ist die Idee von Java ist, dass Sie sollten nicht mit Arbeitsspeicher mit Ausnahme von "neu" zu allozieren neuer Objekte und sicherzustellen, dass es keine Referenzen Links zu Objekten, wenn Sie fertig sind mit Ihnen.
Alle der rest ist absichtlich, um die Java-Laufzeitumgebung und ist - auch bewusst - definiert als vage wie möglich, damit die JVM-Designer die Freiheit, zu tun, so effizient.
Um eine Analogie zu verwenden: das Betriebssystem verwaltet die benannten Bereiche von MB Speicherplatz auf der Festplatte ("Dateien") für Sie. Einschließlich löschen und wiederverwenden Bereiche, die Sie nicht verwenden möchten, nicht mehr. Sie nicht umgehen, Mechanismus, aber überlassen Sie es dem Betriebssystem
Sollten Sie Ihren Fokus auf das schreiben von klaren, einfachen code, und sicherzustellen, dass Ihre Objekte ordentlich erledigt. Damit wird die JVM, die bestmöglichen Arbeitsbedingungen.
InformationsquelleAutor Thorbjørn Ravn Andersen
Sind Sie richtig, zu sagen, dass
System.gc()
ist eine Anforderung an den compiler und nicht ein Befehl. Aber mit untenstehenden Programm können Sie sicherstellen, dass es passiert.InformationsquelleAutor Ishan Aggarwal
Ich würde vorschlagen, einen Blick auf die folgenden tutorials und seinen Inhalt
Dies ist eine vierteilige tutorial-Reihe zu wissen, über die Grundlagen der garbage collection in
Java
:Java Garbage Collection Einführung
Wie Java Garbage Collection Funktioniert?
Arten von Java-Garbage-Kollektoren
Überwachung und Analyse von Java-Garbage-Collection
Fand ich Dieses tutorial sehr hilfreich.
InformationsquelleAutor Tasawar Hussain
"Zunichte machen"ing die Referenz, wenn es nicht erforderlich ist, ist der beste Weg, um ein Objekt für die Garbage collection freigegeben.
Gibt es 4 Möglichkeiten, in denen ein Objekt von der Garbage Collection freigegeben.
1. Punkt der Referenz auf null, sobald diese nicht mehr benötigt werden.
Sobald dieser String ist nicht erforderlich, Sie können zeigen Sie es auf null.
Daher werden für die Garbage collection freigegeben.
Punkt eines Objektes zu einem anderen, so dass beide Referenzpunkte, die auf das selbe Objekt und einer von dem Objekt bei der Speicherbereinigung (GC.
String s1 = new String("Java");
String s2 = new String("C++");
In Zukunft, wenn s2 auch muss darauf hingewiesen s1;
Dann das Objekt mit "Java" kommen für GC.
Alle erstellten Objekte in einer Methode kommen für GC, nachdem die Methode abgeschlossen ist. Daher, sobald die Methode ist zerstört, aus dem Stapel des Threads dann die entsprechenden Objekte in dieser Methode zerstört werden.
Insel der Isolation ist ein weiteres Konzept, in dem die Objekte mit internen links und keine extrinsische link zu verweisen ist für die Garbage collection freigegeben.
"Insel der isolation" von Garbage Collection
Beispiele:
Unten ist eine Methode der Camera-Klasse in android. Sehen, wie die Entwickler darauf mCameraSource einmal null ist nicht erforderlich. Das ist Experten-level-code.
Wie der Garbage Collector funktioniert?
Die Garbage collection durchgeführt wird, indem der daemon thread namens Garbage Collector. Wenn ausreichend Arbeitsspeicher verfügbar ist, die Zeit dieser Dämon-thread hat geringe Priorität und es läuft im hintergrund. Aber wenn die JVM feststellt, dass der heap voll ist und JVM will, Speicherplatz gewinnen, dann erhöht sich die Priorität des Garbage-collector-thread und ruft Runtime.getRuntime.gc () - Methode, die sucht nach allen Objekten, die nicht mit Referenz-oder null-Verweis und zerstört diese Objekte.
InformationsquelleAutor Utsav