When is an Object Subject to Garbage Collection

An object is subject to garbage collection when it becomes unreachable to the program in which it is used.

In Java, an object becomes eligible for garbage collection when there are no more references to it. The Java Virtual Machine (JVM) has a garbage collector that automatically identifies and removes objects that are no longer reachable by the program. Objects can become unreachable in the following ways:

  1. Nullifying References: If all references to an object are set to null, the object becomes unreachable.
    java
    MyClass obj = new MyClass();
    obj = null; // The object is now unreachable
  2. Scope of References: If an object is created within a method and the reference to that object is limited to the scope of that method, once the method exits, the object becomes unreachable.
    java
    void someMethod() {
    MyClass obj = new MyClass();
    // obj is only reachable within this method
    }
  3. Object Reference Reassignment: If an object reference is reassigned to another object, and there are no other references to the original object, it becomes unreachable.
    java
    MyClass obj1 = new MyClass();
    MyClass obj2 = new MyClass();
    obj1 = obj2; // obj1 now references the same object as obj2, and the original obj1 is unreachable
  4. Circular References: If there is a circular chain of references among objects, and none of the objects in the chain are reachable from outside the chain, then the entire chain becomes unreachable.
    java
    class MyClass {
    MyClass anotherObject;
    }
    MyClass obj1 = new MyClass();
    MyClass obj2 = new MyClass();
    obj1.anotherObject = obj2;
    obj2.anotherObject = obj1;
    // The entire chain (obj1, obj2) becomes unreachable if no external reference points to either obj1 or obj2

Garbage collection is an automatic process, and the JVM takes care of reclaiming memory occupied by objects that are no longer needed. Developers do not explicitly deallocate memory or invoke garbage collection; it is handled by the JVM.