2012-10-29 11 views
7

Tworzę przykładowy program demonstracyjny, aby zrozumieć, w jaki sposób mogę zwolnić odwołanie do zmiennych statycznych, metod w java za pomocą garbage collectora?Czy garbage collector działa na statycznych zmiennych lub metodach w java?

Używam słabej referencji, aby nie zapobiegać zbieraczowi.

Klasa 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; 
    } 
} 

Klasa 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()); //[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 
    } 

} 
+0

Śmieciarka zbiera przedmioty, a nie zmienne. Zmienna jest kontenerem, który/zawiera/odniesienie. A co najważniejsze, w większości przypadków nie chcesz robić bałaganu ze zbieraniem śmieci. – ignis

+0

Zbyt wiele statystyk. Dlaczego je miksujesz? –

+0

Nie, będziesz musiał sprzątać po sobie – Nactus

Odpowiedz

16

pól stałych są związane z klasą, a nie jednostka np.

Pola statyczne są oczyszczane, gdy klasa klasy ładuje klasę bez obciążenia. W wielu prostych programach, to nigdy nie jest.

Jeśli chcesz, aby pola były powiązane z instancjami i czyszczone, a następnie instancja jest czyszczona, utwórz pola instancji, a nie statyczne.

+0

Co więcej, czy literały łańcuchowe nigdy nie są GC, ponieważ są przechowywane w literałowej puli String? Czy jest to również na podstawie klasy klienckiej? –

+1

AFAIK Literały łańcuchowe są czyszczone. Jeśli intern() wiele losowych ciągów znaków i je odrzuci, nie dostaniesz OOME. Gdzie internowane łańcuchy stanowią problem to, że aż do wersji Java 6 były one w PermGen i można było dostać OOME wypełniające tę przestrzeń, gdy miałeś dużo sterty. W języku Java 7 literały ciągu są w stercie. –

+0

Dzięki za wszystkie odpowiedzi. –

4

System.gc() nie wymusza śmieciarza uruchomić. Jest to tylko sugestia dla JVM, że prawdopodobnie jest to dobry czas na uruchomienie narzędzia do zbierania śmieci. Zobacz to pytanie - When does System.gc() do anything

3

Powinieneś zrozumieć, że System.gc(); nie wywołuje śmieciarza. Grzecznie prosi GC o usunięcie śmieci. GC decyduje, co zrobić i kiedy zacząć. Dlatego nie oczekuj natychmiastowego efektu po wywołaniu System.gc();, przypisaniu null do zmiennej itp.

GC usuwa wszystkie obiekty, do których nie można uzyskać dostępu w jakikolwiek sposób. Więc jeśli kod został zakończony, gdy zdefiniowano zmienną, obiekt można usunąć. Przypisanie wartości null usuwa odniesienie. Słabe odniesienie nie uniemożliwia GC usunięcia obiektu.

Mam nadzieję, że to wyjaśnienie pomaga.

4

innych niż program, aby odpowiedzieć na Twoje pytanie

  1. nr Metody nie są garbage zebrane, ponieważ nie istnieje w stercie w pierwszej kolejności.

  2. zmiennych statycznych należą na przykład klasy nie będzie śmieci zebrano po załadowaniu (dla większości ogólnych Classloaders)

Powiązane problemy