Il garbage collector funziona su variabili o metodi statici in java?

Sto creando un programma dimostrativo di esempio per farmi capire che come posso deallocare il riferimento di variabili statiche, metodi in java usando Garbage Collector?

Sto usando il riferimento debole per non impedire il garbage collector.

Sample class

 public class Sample { private static String userName; private static String password; static { userName = "GAURAV"; password = "password"; } public static String getUserName(){ return userName; } public static String getPassword(){ return password; } } 

User class

 import java.lang.ref.WeakReference; public class User { public static void main(String[] args) { /** * Created one object of Sample class */ Sample obj1 = new Sample(); /** * I can also access the value of userName through it's class name */ System.out.println(obj1.getUserName()); //GAURAV WeakReference wr = new WeakReference(obj1); System.out.println(wr.get()); //[email protected] obj1 = null; System.gc(); System.out.println(wr.get()); // null /** * I have deallocate the Sample object . No more object referencing the Sample oblect class but I am getting the value of static variable. */ System.out.println(Sample.getUserName()); // GAURAV } } 

i campi statici sono associati alla class, non a una singola istanza.

i campi statici vengono ripuliti quando il ClassLoader che mantiene la class scaricata. In molti programmi semplici, questo non è mai.

Se si desidera che i campi vengano associati a un’istanza e ripuliti, l’istanza viene ripulita, rendendoli campi di istanza, non statici.

System.gc () non impone l’esecuzione di Garbage Collector. È solo un suggerimento per JVM che probabilmente è un buon momento per eseguire Garbage Collector. Vedi questa domanda – Quando System.gc () fa qualcosa

Oltre al programma, per rispondere alla tua domanda

  1. No. I metodi non sono garbage collection perché non esistono nell’heap in primo luogo.

  2. Le variabili statiche appartengono all’istanza di Class e non saranno raccolte dopo la procedura di caricamento (per la maggior parte dei Classloader generali)

Dovresti capire che System.gc(); non chiama Garbage Collector. Chiede gentilmente a GC di rimuovere alcuni rifiuti. GC decide cosa fare e quando iniziare da solo. Quindi, non aspettarti che vedrai alcun effetto immediato quando chiami System.gc(); , assegnando da null a variabile, ecc.

GC rimuove tutti gli oggetti a cui non è ansible accedere in alcun modo. Quindi, se il codice terminava il blocco in cui era definita la variabile, l’object può essere rimosso. Assiging null rimuove il riferimento. Un riferimento debole non impedisce a GC di rimuovere l’object.

Spero che questa spiegazione aiuti.