Das ist eine sehr lästige Frage, und ich glaube, sie trägt dazu bei, dass viele gegen Java sind, obwohl es eine sehr nützliche Sprache ist.
Die Tatsache, dass man sich nicht darauf verlassen kann, dass "System.gc" irgendetwas tut, ist unglaublich entmutigend und kann leicht ein Gefühl von "Fear, Uncertainty, Doubt" in der Sprache hervorrufen.
In vielen Fällen ist es gut, mit Speicherspitzen umzugehen, die Sie absichtlich verursachen, bevor ein wichtiges Ereignis eintritt, das bei den Benutzern den Eindruck erwecken würde, Ihr Programm sei schlecht konzipiert/unreaktionsfähig.
Die Möglichkeit, die Garbage Collection zu kontrollieren, wäre ein großartiges Bildungsinstrument, das wiederum das Verständnis der Menschen für die Funktionsweise der Garbage Collection verbessern würde und ihnen zeigen würde, wie sie Programme erstellen können, die sowohl das Standardverhalten als auch das kontrollierte Verhalten ausnutzen.
Ich möchte noch einmal auf die Argumente in diesem Thread eingehen.
- Sie ist ineffizient:
Oft tut das Programm gar nichts, und Sie wissen, dass es nichts tut, weil es so konzipiert wurde. Es könnte zum Beispiel eine lange Wartezeit mit einer großen Warte-Meldungsbox durchlaufen, und am Ende könnte es einen Aufruf zum Sammeln von Müll hinzufügen, weil die Zeit, um ihn auszuführen, nur einen Bruchteil der Zeit der langen Wartezeit benötigt, aber verhindert, dass gc mitten in einer wichtigeren Operation versagt.
- Das ist immer eine schlechte Praxis und deutet auf fehlerhaften Code hin.
Ich bin anderer Meinung, es ist egal, welchen Garbage Collector Sie haben. Seine Aufgabe ist es, Müll aufzuspüren und ihn zu beseitigen.
Indem Sie gc zu Zeiten aufrufen, in denen die Nutzung weniger kritisch ist, verringern Sie die Wahrscheinlichkeit, dass es ausgeführt wird, wenn Ihr Leben von der Ausführung des spezifischen Codes abhängt, aber stattdessen beschließt es, Müll zu sammeln.
Sicher, es verhält sich vielleicht nicht so, wie Sie es wollen oder erwarten, aber wenn Sie es aufrufen wollen, wissen Sie, dass nichts passiert, und der Benutzer ist bereit, die Verlangsamung/Ausfallzeit zu tolerieren. Wenn das System.gc funktioniert, großartig! Wenn nicht, dann haben Sie es wenigstens versucht. Es gibt einfach keinen Nachteil, es sei denn, der Garbage Collector hat inhärente Seiteneffekte, die etwas schrecklich Unerwartetes tun, wie sich ein Garbage Collector verhalten sollte, wenn er manuell aufgerufen wird, und das allein verursacht schon Misstrauen.
- Dies ist kein üblicher Anwendungsfall:
Es handelt sich um einen Anwendungsfall, der nicht zuverlässig erreicht werden kann, der aber möglich wäre, wenn das System so konzipiert wäre. Es ist wie eine Ampel und machen es so, dass einige / alle der Ampel "Tasten tun nichts, es macht Sie Frage, warum die Taste gibt es mit zu beginnen, Javascript hat keine Garbage Collection Funktion, so dass wir es nicht so viel für sie hinterfragen.
- Die Spezifikation besagt, dass System.gc() ein Hinweis darauf ist, dass GC ausgeführt werden soll, und dass es der VM freisteht, ihn zu ignorieren.
was ist ein "hinweis"? was ist "ignorieren"? ein computer kann nicht einfach hinweise annehmen oder etwas ignorieren, es gibt strenge Verhaltensweisen, die dynamisch sein können und von der Absicht des Systems geleitet werden. Eine angemessene Antwort würde beinhalten, was der Garbage Collector auf der Implementierungsebene tatsächlich tut, das ihn dazu veranlasst, die Sammlung nicht durchzuführen, wenn Sie sie anfordern. Ist die Funktion einfach ein Nop? Gibt es bestimmte Bedingungen, die erfüllt werden müssen? Wie lauten diese Bedingungen?
In seiner jetzigen Form wirkt der GC von Java oft wie ein Monster, dem man einfach nicht trauen kann. Man weiß nicht, wann er kommt oder geht, man weiß nicht, was er tun wird und wie er es tun wird. Ich kann mir vorstellen, dass einige Experten eine bessere Vorstellung davon haben, wie ihre Garbage Collection auf Befehlsbasis funktioniert, aber die große Mehrheit hofft einfach, dass sie "einfach funktioniert", und einem undurchsichtig erscheinenden Algorithmus vertrauen zu müssen, dass er die Arbeit für einen erledigt, ist frustrierend.
Es ist ein großer Unterschied, ob man über etwas liest oder etwas beigebracht bekommt, oder ob man die tatsächliche Umsetzung sieht, die Unterschiede zwischen den verschiedenen Systemen und die Möglichkeit, damit zu spielen, ohne den Quellcode ansehen zu müssen. Das schafft Vertrauen und das Gefühl von Beherrschung/Verständnis/Kontrolle.
Zusammenfassend lässt sich sagen, dass es ein inhärentes Problem mit den Antworten "diese Funktion könnte nichts tun, und ich werde nicht ins Detail gehen, wie man erkennt, wann sie etwas tut und wann nicht und warum sie es tut oder nicht tut, was oft impliziert, dass es einfach gegen die Philosophie ist, es zu versuchen, selbst wenn die Absicht dahinter vernünftig ist".
Es mag in Ordnung sein, dass sich die Java GC so verhält, wie sie es tut, oder auch nicht, aber um sie zu verstehen, ist es schwierig, wirklich nachzuvollziehen, in welche Richtung man gehen muss, um einen umfassenden Überblick darüber zu bekommen, was man der GC zutrauen kann und was nicht, also ist es zu einfach, der Sprache zu misstrauen, denn der Zweck einer Sprache ist es, ein kontrolliertes Verhalten bis zu einem philosophischen Ausmaß zu haben (es ist leicht für einen Programmierer, (es ist leicht für einen Programmierer, besonders für einen Anfänger, in eine existenzielle Krise zu geraten, wenn bestimmte Verhaltensweisen des Systems/der Sprache), die man tolerieren kann (und wenn man das nicht kann, wird man die Sprache einfach nicht benutzen, bis man es muss), und mehr Dinge, die man nicht kontrollieren kann, ohne dass man weiß, warum man sie nicht kontrollieren kann, sind von Natur aus schädlich.
4 Stimmen
Ich denke, ein guter Zeitpunkt, um System.gc() aufzurufen, ist, wenn Sie etwas tun, das bereits ein langer Ladeprozess ist. Ich arbeite zum Beispiel an einem Spiel und plane, System.gc() aufzurufen, wenn das Spiel einen neuen Level lädt, am Ende des Ladevorgangs. Der Benutzer wartet bereits ein wenig, und die zusätzliche Leistungssteigerung könnte es wert sein; aber ich werde auch eine Option in den Konfigurationsbildschirm aufnehmen, um dieses Verhalten zu deaktivieren.
1 Stimmen
Ein weiterer Fall wurde erläutert in java-monitor.com/forum/showthread.php?t=188 Dort wird erklärt, warum es eine schlechte Praxis sein kann, die Funktion System.gc() aufzurufen.
0 Stimmen
Nur meine zwei Cent, nachdem ich einige der Antworten gelesen habe (und es sollte angemerkt werden, dass ich ziemlich neu in Java bin, also bitte nehmen Sie meine Meinung mit einem Körnchen Salz), aber... Ich denke, die bessere Frage wäre: "Warum haben Sie überhaupt eine so große HashMap?"