Automatic garbage collection is done in the background by a low-priority thread.
The garbage collector calls the class destructor-method finalize() if defined and then frees the memory.
The methods System.gc() and Runtime.gc() suggest that the Java Virtual Machine to recycle unused objects.
Only the JVM decides when to run the GC, you can only suggest it.
Java applications can run out of memory.
The finalize() method is guaranteed to run once and only once before the garbage collector deletes an object.
The garbage collector makes no guarantees, finalize() may never run.
You can uneligibilize an object for GC from within finalize().