Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does the garbage collector work on static variables or methods in java?

I am creating a sample demo program for make me understand that how can I deallocate the reference of static variables, methods in java using garbage collector?

I am using Weak Reference for not preventing the garbage collector.

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

Class 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
    }

}
like image 433
gaurav kumar Avatar asked Oct 29 '12 17:10

gaurav kumar


4 Answers

static fields are associated with the class, not an individual instance.

static fields are cleaned up when the ClassLoader which hold the class unloaded. In many simple programs, that is never.

If you want the fields to be associated with an instances and cleaned up then the instance is cleaned up, make them instance fields, not static ones.

like image 79
Peter Lawrey Avatar answered Oct 10 '22 11:10

Peter Lawrey


Other than the program, to answer your question

  1. No. Methods are not garbage collected because they don't exist in the heap in the first place.

  2. Static variables belong to the Class instance and will not be garbage collected once loaded (for most of the general Classloaders)

like image 32
Arun Manivannan Avatar answered Oct 10 '22 10:10

Arun Manivannan


System.gc() does not force garbage collector to run. It is just a suggestion to JVM that probably it is a good time to run garbage collector. See this question - When does System.gc() do anything

like image 24
user1700184 Avatar answered Oct 10 '22 09:10

user1700184


You should understand that System.gc(); does not call garbage collector. It just politely asks GC to remove some garbage. GC decides what to do and when to start itself. So, do not expect that you will see any immediate effect when calling System.gc();, assigning null to variable etc.

GC removes all objects that cannot be accessed by any way. So if code exited block where variable was defined the object can be removed. Assiging null removes the reference. Weak reference does not prevent GC from removing the object.

I hope this explanation helps.

like image 40
AlexR Avatar answered Oct 10 '22 09:10

AlexR