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
}
}
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.
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 callingSystem.gc();
, assigningnull
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.
Other than the program, to answer your question
No. Methods are not garbage collected because they don't exist in the heap in the first place.
Static variables belong to the Class instance and will not be garbage collected once loaded (for most of the general Classloaders)
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