Statische Methoden sind nur Methoden, sie werden nicht auf dem Heap gespeichert, sie können einfach keinen "this" Parameter verwenden.
Statische Variablen dienen als "Wurzeln" zum GC. Wenn Sie sie nicht explizit auf null setzen, bleiben sie so lange bestehen, wie das Programm läuft, und alles, was von ihnen erreichbar ist.
Eine Situation wird nur als Speicherverlust angesehen, wenn Sie beabsichtigen, dass der Speicher frei wird und nicht frei wird. Wenn Sie beabsichtigen, dass Ihre statische Variable einen Verweis auf ein Objekt für einen Teil der Zeit enthält und Sie vergessen, sie auf Null zu setzen, wenn Sie mit diesem Objekt fertig sind, würden Sie wahrscheinlich mit einem Leck enden. Wenn Sie es jedoch in die statische Variable einfügen und beabsichtigen, dass es dort ist, solange das Programm läuft, dann ist es definitiv kein Leck, es ist eher ein "permanenter Singleton". Wenn das Objekt zurückgewonnen wurde, während es noch existieren sollte, wäre das sehr schlecht gewesen.
Was Ihre Frage zum Heap betrifft: Alle Objekte in Java existieren entweder auf dem Heap oder auf dem Stack. Objekte werden auf dem Heap mit dem neuen Operator erstellt. Ein Verweis wird ihnen dann beigefügt. Wenn die Referenz null wird oder außerhalb des Gültigkeitsbereichs liegt (z. B. Ende des Blocks), erkennt der GC, dass es keine Möglichkeit gibt, das Objekt jemals wieder zu erreichen und es zurückzufordern. Wenn sich Ihre Referenz in einer statischen Variablen befindet, fällt sie niemals außerhalb des Bereichs, aber Sie können sie immer noch auf null oder auf ein anderes Objekt setzen.
IIRC Die statischen Felder werden angezeigt, sobald die Klasse, die sie deklariert, GCed ist.Wenn die elast-Instanz der Klasse nicht mehr existiert, wird die Klassendeklaration und die statischen Felder mitgenommen. – ordnungswidrig
Ich bin mir nicht sicher, ob @ o11rig völlig korrekt ist, aber ich glaube, dass der GC Statiken für Klassen erfassen darf, die unter bestimmten Umständen keine Mitglieder haben. Ich habe das aus ein paar Quellen gehört, aber nie eine genaue Erklärung gehört. –
Geringfügige Fehler: Alle Java * -Objekte * leben im Heap. Object * references * und Primitive können auf dem Stack gespeichert werden, wenn sie Locals der gerade ausgeführten Methode sind und ansonsten im Heap gespeichert werden. (Außer in jeder modernen JVM mit einem JIT, wo der JIT-Optimierer Objekte beliebig platzieren kann, solange es noch * handelt * wie die Objekte auf dem Haufen sind.) Und es könnte argumentiert werden, dass statische Methoden - oder zumindest der Java-Bytecode, der sie implementiert - lebt auch auf dem Heap als Teil des Class-Objekts, das die Klasse repräsentiert, in der sie definiert wurden. –