Wie kann ich Speicher in Java freigeben?
Gibt es einen Weg, um Speicher frei in Java ist ähnlich wie C s free()
Funktion? Oder setzt das Objekt auf null und verlässt sich auf GC die einzige option?
InformationsquelleAutor der Frage Felix | 2009-10-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Java verwendet verwalteten Speicher, so dass der einzige Weg, Sie können Speicher zuweisen, ist die Verwendung des
new
Betreiber, und der einzige Weg, können Sie Speicher freigeben, ist, indem Sie sich auf den garbage collector.Diese memory management whitepaper (PDF) kann helfen, zu erklären, was Los ist.
Können Sie uns auch anrufen
System.gc()
zu vermuten, dass der garbage collector ausgeführt sofort. Allerdings ist die Java Runtime macht die endgültige Entscheidung, nicht Ihr code.Entsprechend der Java-Dokumentation
InformationsquelleAutor der Antwort Daniel Pryden
Niemand zu haben scheint, erwähnt ausdrücklich die Einstellung von Objekt-Referenzen zu
null
das ist eine legitime Technik, um "Befreiung" - Speicher können Sie zu prüfen.Zum Beispiel, sagen, Sie würden erklärt
List<String>
am Anfang einer Methode, die wuchs in der Größe sehr groß zu sein, aber war nur so lange gefordert, bis auf halbem Weg durch die Methode. Man könnte an dieser Stelle die Liste gesetzt Verweis aufnull
zu ermöglichen, dass der garbage collector möglicherweise zurückfordern dieses Objekt, bevor die Methode abgeschlossen ist (und die Referenz außerhalb des gültigen Bereichs sowieso).Hinweis, dass ich nur selten verwenden Sie diese Technik in der Realität, aber es ist eine überlegung Wert, beim Umgang mit sehr grossen Datenstrukturen.
InformationsquelleAutor der Antwort Adamski
Nicht empfohlen.
Edit: ich habe die original-Antwort im Jahre 2009. Es ist jetzt 2015.
Müll-Sammler bekommen haben, stetig besser in die ~20 Jahre Java schon. An diesem Punkt, wenn Sie manuell den Aufruf der garbage collector, die Sie betrachten wünschen können, andere Ansätze:
InformationsquelleAutor der Antwort Dean J
*"Ich persönlich verlassen Sie sich auf nulling-Variablen als Platzhalter für zukünftige ordnungsgemäße Löschung. Zum Beispiel, ich nehmen Sie sich die Zeit zunichte, die alle Elemente eines Arrays, bevor Sie Sie tatsächlich löschen (macht null) das array selbst."
Ist dies unnötig. Die Art und Weise der Java-GC funktioniert, ist es findet Objekte, die keinen Bezug zu Ihnen, also wenn ich ein Objekt x mit einem Verweis (=variable), die Punkte, die GC nicht löschen, weil es ist ein Verweis auf das Objekt:
Wenn Sie null ein, als dies passiert:
So, jetzt x nicht mit einem Verweis auf Sie und werden gelöscht. Das gleiche passiert, wenn Sie eine Referenz auf ein anderes Objekt als x.
Also, wenn Sie ein array arr, dass Verweise auf Objekte x, y und z und eine variable, die eine Referenz auf das array sieht es so:
Wenn Sie null ein, als dies passiert:
Also die GC findet arr, als ohne Referenz auf und löscht es, die Ihnen diese Struktur:
Nun die GC findet x, y und z, und löscht diese auch. Nulling-jede Referenz in das array machen nicht alles besser, es wird nur bis CPU-Zeit und Raum in den code (das heißt, es wird nicht weiter weh als das. Die GC noch in der Lage sein zu führen, wie es soll).
InformationsquelleAutor der Antwort Dakkaron
Einen triftigen Grund für den Wunsch nach einem freien Speicher von jedem programm (java oder nicht ) um mehr Speicherplatz für andere Programme auf Betriebssystem-Ebene. Wenn meine java-Anwendung ist mit 250MB kann ich zwingen wollen, es unten zu 1MB und machen die 249MB für andere apps verfügbar.
InformationsquelleAutor der Antwort Yios
Habe ich getan Experimentierfreude.
Es ist wahr, dass
System.gc();
schlägt nur zum ausführen der Garbage Collector.Aber anrufen
System.gc();
nach der Einstellung alle Verweise zunull
verbessern performance-und memory-Besetzung.InformationsquelleAutor der Antwort Hemant Yadav
Erweitern auf die Antwort und Kommentar von Yiannis Xanthopoulos und Hot Licks (sorry, ich kann nicht kommentieren noch!), Sie können VM-Optionen wie in diesem Beispiel:
In meinem jdk 7 wird diese Version nicht verwendete VM-Speicher, wenn mehr als 30% der heap wird-frei nach dem GC, wenn die VM im Leerlauf ist. Sie werden wahrscheinlich brauchen, optimieren diese Parameter.
Während ich nicht sehen, es betont den link unten, beachten Sie, dass einige Müll-Sammler können nicht gehorchen diesen Parametern und Standard-java kann wählen Sie eine dieser, für Sie, sollten Sie zufällig auf mehr als einem Kern (daher der UseG1GC-argument oben).
VM-Argumente
Update: Für java 1.8.0_73 ich habe den JVM gelegentlich Freisetzung kleine Mengen mit den default-Einstellungen. Scheint es nur tun, wenn ~70% des heap ist unbenutzt aber.. weiß nicht, ob es wäre aggressiv loslassen, wenn der OS war wenig physischen Speicher.
InformationsquelleAutor der Antwort nsandersen
Wenn Sie wirklich wollen, zu reservieren und gratis einen block von Speicher, die Sie tun können diese mit direct ByteBuffers. Es gibt sogar eine nicht-portable Weg, um den Speicher frei.
Jedoch, wie bereits vorgeschlagen, einfach, weil Sie haben, um Speicher frei in C, bedeutet nicht, dass es eine gute Idee zu haben, dies zu tun.
Wenn Sie glauben, Sie haben einen wirklich guten Verwendungszweck für free(), geben Sie diese bitte in die Frage, damit wir sehen können, was Sie rtying zu tun, es ist ziemlich wahrscheinlich, dass es einen besseren Weg gibt.
InformationsquelleAutor der Antwort Peter Lawrey
Ganz aus javacoffeebreak.com/faq/faq0012.html
InformationsquelleAutor der Antwort Stefan Falk
In meinem Fall, da mein Java-code soll die Portierung nach anderen Sprachen, die in Naher Zukunft (vor allem C++), ich möchte wenigstens ein Lippenbekenntnis zur Befreiung Speicher richtig so hilft es, die Portierung später auf.
Ich persönlich verlassen Sie sich auf nulling-Variablen als Platzhalter für zukünftige ordnungsgemäße Löschung. Zum Beispiel, ich nehmen Sie sich die Zeit zunichte, die alle Elemente eines Arrays, bevor Sie Sie tatsächlich löschen (macht null) das array selbst.
Aber mein Fall ist sehr speziell, und ich weiß, ich bin dabei, die Leistung trifft, wenn dies zu tun.
InformationsquelleAutor der Antwort Oskuro
* "Zum Beispiel, sagen, Sie würden deklariert eine Liste am Anfang einer
Methode, die wuchs in der Größe sehr groß zu sein, war aber nur erforderlich,
bis auf halbem Weg durch die Methode. Man könnte an diesem Punkt setzen die
Liste Referenz auf null zu ermöglichen, dass der garbage collector potenziell
reclaim dieses Objekt, bevor die Methode abgeschlossen ist (und die Referenz
fällt aus dem Rahmen sowieso)." *
Dies ist korrekt, aber diese Lösung kann nicht sein, verallgemeinerbare. Während der Einstellung eines List-Objekts Referenz auf null -wird - machen Sie den verfügbaren Speicher für garbage collection, dies ist nur wahr für ein List-Objekt von primitiven Typen. Wenn das List-Objekt stattdessen enthält die Referenz-Typen, Einstellung der Liste object = null wird nicht dereferenzieren -alle - die-Referenz-Typen enthalten in der Liste. In diesem Fall, die Einstellung der Liste object = null Waise die enthaltenen Referenz-Typen, deren Objekte nicht verfügbar für den garbage collection-es sei denn, die garbage-collection-Algorithmus ist intelligent genug, um zu bestimmen, dass die Objekte, die aufgegeben wurden.
InformationsquelleAutor der Antwort Gothri
Althrough java bietet eine automatische garbage collection manchmal möchte man wissen, wie groß das Objekt ist und wie viel davon übrig ist .Der freie Speicher mit Programm
import java.lang;
undRuntime r=Runtime.getRuntime();
zu erhalten-Werte Speicher mitmem1=r.freeMemory();
freien Speicher rufen Sie dier.gc();
- Methode und dem AufruffreeMemory()
InformationsquelleAutor der Antwort Benjamin
Empfehlung von JAVA ist die Zuordnung zu null
Vom https://docs.oracle.com/cd/E19159-01/819-3681/abebi/index.html
InformationsquelleAutor der Antwort user3869837