Работает ли сборщик мусора со статическими переменными или методами в java?

Я создаю пример демонстрационной программы, чтобы понять, что как я могу освободить ссылку на статические переменные, методы в java с помощью сборщика мусора?

Я использую слабую ссылку для предотвращения сборщика мусора.

класс Sample

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

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<Sample> wr = new WeakReference<Sample>(obj1);
        System.out.println(wr.get());  //com.test.ws.Sample@f62373
        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
    }

}

4 ответов


статические поля связаны с классом, а не отдельного экземпляра.

статические поля очищаются, когда ClassLoader, который держит класс выгружен. Во многих простых программах-никогда.

Если вы хотите, чтобы поля были связаны с экземплярами и очищены, то экземпляр очищается, сделайте их полями экземпляра, а не статическими.


кроме программы, чтобы ответить на ваш вопрос

  1. нет. методы не собирают мусор потому что они не существуют в куче на первом месте.

  2. статические переменные принадлежат экземпляру класса и не будут собирать мусор после загрузки (для большинства общих загрузчиков классов)


вы должны понять, что System.gc(); не вызывает сборщик мусора. Он просто вежливо просит GC удалить какой-то мусор. GC решает, что делать и когда начинать. Таким образом, не ожидайте, что вы увидите какой-либо немедленный эффект при вызове System.gc();, назначение null к переменной etc.

GC удаляет все объекты, к которым невозможно получить доступ. Поэтому, если код вышел из блока, где была определена переменная, объект можно удалить. Назначение null удаляет ссылку. Слабая ссылка не препятствует удалению объекта GC.

надеюсь, это объяснение поможет.