I am a fresh new learner of Java. I\'m now learning the concept of WeakReference. I came across a problem which probably looks stupid but I just wanna figure out the reason.
Firstly, System.gc()
does not ensure a garbage collection. Instead, it's just a hint that "It's a good time to run garbage collection".
Secondly, in your code when you put A a1 = wr.get();
before calling System.gc()
, it creates a new strong reference to the same object referenced by a
, thus even if garbage collection runs, your object will not be garbage collected.
As we have two tasks in hand
Let's do little modification to your code
public class A {
public static void main(String[] args) {
A a = new A();
WeakReference wr = new WeakReference<>(a);
a = null;
// A a1 = wr.get(); Removing this, this does our 2nd task
System.out.println(a);
// System.out.println(a1); Removing this as a1 does not exists anymore
try {
while (null != wr.get()) { // 1st task done, the loop ensures sending the hint until your object collected
System.gc();
// Thread.sleep(10000); it does not have impact
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(wr.get()); // Obviously prints null
}
@Override
protected void finalize() {
System.out.println(Thread.currentThread().getName() + ": See ya, nerds!");
}
}