Dies ist eine sehr lästige Frage, und ich glaube, dass viele dazu beitragen, dass sich Java gegen Java ausspricht, obwohl es für eine Sprache nützlich ist.
Die Tatsache, dass Sie "System.gc" nicht vertrauen können, um etwas zu tun, ist unglaublich entmutigend und kann leicht das Gefühl "Angst, Unsicherheit, Zweifel" für die Sprache hervorrufen.
In vielen Fällen ist es hilfreich, mit Speicherspitzen umzugehen, die Sie absichtlich verursachen, bevor ein wichtiges Ereignis eintritt. Dies würde dazu führen, dass Benutzer glauben, Ihr Programm sei schlecht gestaltet / reagiert nicht.
Die Fähigkeit, die Speicherbereinigung zu steuern, wäre ein großartiges Schulungsinstrument, um das Verständnis der Menschen für die Funktionsweise der Speicherbereinigung zu verbessern und Programme dazu zu bringen, das Standardverhalten sowie das kontrollierte Verhalten auszunutzen.
Lassen Sie mich die Argumente dieses Threads überprüfen.
- Es ist ineffizient:
Oft macht das Programm nichts und Sie wissen, dass es aufgrund der Art und Weise, wie es entworfen wurde, nichts tut. Zum Beispiel kann es sein, dass es eine lange Wartezeit mit einem großen Wartemeldungsfeld gibt, und am Ende kann es auch einen Aufruf zum Sammeln von Müll hinzufügen, da die Zeit zum Ausführen einen sehr kleinen Bruchteil der Zeit in Anspruch nimmt langes Warten, aber verhindert, dass gc mitten in einer wichtigeren Operation agiert.
- Es ist immer eine schlechte Praxis und weist auf fehlerhaften Code hin.
Ich bin anderer Meinung, es spielt keine Rolle, welchen Müllsammler Sie haben. Seine Aufgabe ist es, Müll aufzuspüren und zu reinigen.
Indem Sie den gc in Zeiten aufrufen, in denen die Nutzung weniger kritisch ist, verringern Sie die Wahrscheinlichkeit, dass er ausgeführt wird, wenn Ihr Leben von dem spezifischen Code abhängt, der ausgeführt wird. Stattdessen wird entschieden, Müll zu sammeln.
Sicher, es verhält sich möglicherweise nicht so, wie Sie es möchten oder erwarten, aber wenn Sie es aufrufen möchten, wissen Sie, dass nichts passiert, und der Benutzer ist bereit, Langsamkeit / Ausfallzeiten zu tolerieren. Wenn das System.gc funktioniert, großartig! Wenn nicht, haben Sie es zumindest versucht. Es gibt einfach keine Nachteile, es sei denn, der Garbage Collector hat inhärente Nebenwirkungen, die etwas schrecklich Unerwartetes bewirken, wie sich ein Garbage Collector verhalten soll, wenn er manuell aufgerufen wird, und dies allein verursacht Misstrauen.
- Es ist kein häufiger Anwendungsfall:
Dies ist ein Anwendungsfall, der nicht zuverlässig erreicht werden kann, aber möglicherweise, wenn das System so konzipiert wurde. Es ist so, als würde man eine Ampel erstellen und so gestalten, dass einige / alle Ampeltasten nichts tun. Man fragt sich, warum die Taste zunächst vorhanden ist. Javascript hat keine Speicherbereinigungsfunktion, also ziehen wir an prüfe es nicht so sehr dafür.
- Die Spezifikation besagt, dass System.gc () ein Hinweis ist, dass GC ausgeführt werden sollte und die VM es ignorieren kann.
Was ist ein "Hinweis"? Was ist "ignorieren"? Ein Computer kann nicht einfach Hinweise nehmen oder etwas ignorieren. Es gibt strenge Verhaltenspfade, die dynamisch sein können und von der Absicht des Systems geleitet werden. Eine richtige Antwort würde beinhalten, was der Garbage Collector auf Implementierungsebene tatsächlich tut, was dazu führt, dass er keine Erfassung durchführt, wenn Sie ihn anfordern. Ist die Funktion einfach ein Nein? Gibt es irgendwelche Bedingungen, die ich erfüllen muss? Was sind diese Bedingungen?
So wie es aussieht, scheint Javas GC oft ein Monster zu sein, dem man einfach nicht vertraut. Sie wissen nicht, wann es kommen oder gehen wird, Sie wissen nicht, was es tun wird, wie es es tun wird. Ich kann mir vorstellen, dass einige Experten eine bessere Vorstellung davon haben, wie ihre Garbage Collection pro Anweisung funktioniert, aber die große Mehrheit hofft einfach, dass sie "nur funktioniert", und es ist frustrierend, einem undurchsichtig wirkenden Algorithmus vertrauen zu müssen, um für Sie zu arbeiten.
Es gibt eine große Lücke zwischen dem Lesen über etwas oder dem Unterrichten von etwas und dem tatsächlichen Erkennen der Implementierung, der Unterschiede zwischen den Systemen und der Möglichkeit, damit zu spielen, ohne sich den Quellcode ansehen zu müssen. Dies schafft Vertrauen und ein Gefühl der Meisterschaft / des Verständnisses / der Kontrolle.
Zusammenfassend gibt es ein inhärentes Problem mit den Antworten: "Diese Funktion kann möglicherweise nichts bewirken, und ich werde nicht näher darauf eingehen, wie zu erkennen ist, wann sie etwas tut und wann nicht und warum sie nicht oder wird." oft impliziert dies, dass es einfach gegen die Philosophie verstößt, dies zu versuchen, auch wenn die Absicht dahinter vernünftig ist ".
Es mag für Java GC in Ordnung sein, sich so zu verhalten, wie es ist, oder auch nicht, aber um es zu verstehen, ist es schwierig, wirklich zu verfolgen, in welche Richtung Sie gehen müssen, um einen umfassenden Überblick darüber zu erhalten, was Sie dem GC anvertrauen können und nicht zu tun, deshalb ist es zu einfach, der Sprache einfach zu misstrauen, weil der Zweck einer Sprache darin besteht, das Verhalten bis zu einem philosophischen Ausmaß zu kontrollieren (es ist für einen Programmierer, insbesondere für Anfänger, leicht, aufgrund bestimmter System- / Sprachverhalten in eine existenzielle Krise zu geraten) sind in der Lage zu tolerieren (und wenn Sie nicht können, werden Sie die Sprache erst verwenden, wenn Sie müssen), und mehr Dinge, die Sie nicht ohne bekannten Grund kontrollieren können, warum Sie sie nicht kontrollieren können, sind von Natur aus schädlich.