Java Garbage Collector
In Java, garbage collection is a process of providing Automatic Memory Management by reclaiming the runtime unused memory automatically which destroy unused objects.
How to request JVM For Garbage Collector:
System.gc()
method is System class which contain static methodgc()
which request JVM to run Garbage Collector.Runtime.getRuntime().gc()
method is a Runtime class which allows the application to interface with the JVM in which the application is running. Hence by using itsgc()
method, we can request JVM to run Garbage Collector.- There is no guarantee that any of the above two methods will run Garbage Collector
- The call
System.gc()
is effectively equivalent to the callRuntime.getRuntime().gc()
Object be unreferenced For Garbage Collector by
1) nulling the reference
Animal a=new Animal ();
a=null;
2) assigning a reference to another
Animal a1=new Animal();
Animal a2=new Animal();
a1=a2;
3) anonymous object etc.
new Animal();
finalize() method
- The
finalize()
method is invoked each time before the object is garbage collected to perform cleanup activities.Oncefinalize(
) method completes, Garbage Collector destroys that object. finalize()
method is present in Object class
protected void finalize() throws Throwable
Based on requirement, one can override finalize()
method for performing cleanup activities like closing connection from the database.
- Although Garbage Collector is one of the modules of JVM, the
finalize()
method is called by Garbage Collector, not JVM - Since object class
finalize()
method has an empty implementation, thefinalize()
method needs to be overriden to dispose of system resources or perform other cleanups - The
finalize()
method is never invoked more than once for any object. - If an uncaught exception is thrown by the
finalize()
method, the exception is ignored, and the finalization of that object terminates.
Advantages of Garbage Collector:
- It makes java memory-efficient by removing unreferenced objects from heap memory.
- It is automatically done by the garbage collector(a part of JVM)
Examples Of Garbage Collector:
Example 1:
In below example garbage collection is done by calling System.gc().finalize() method is overridden and is invoked just before a object is destroyed by java garbage collection process. Hence you see this method has been invoked twice in the output.
public class Animal{
public static void main(String args[]){
Animal animal_obj=new Animal();
animal_obj=null;
Animal a1 = new Animal();
Animal a2 = new Animal();
a2 = a1;
System.out.println("Garbage Collector Testing\n");
System.gc();
}
protected void finalize() throws Throwable
{
System.out.println("Garbage collection is performed by JVM");
}
}
Output:
Garbage Collector Testing
Garbage collection is performed by JVM
Garbage collection is performed by JVM
Example 2:
In below example to make request to garbage collector, following 3 steps are used before closing brace of sub-block.
- Set references to null. In this case
X = Y = null;
- Call
System.gc();
- Call
System.runFinalization();
class Student {
private int STUD_ID;
private String student_name;
private int student_age;
private static int nextStudentId = 1;
public Student(String student_name, int student_age)
{
this.student_name = student_name;
this.student_age = student_age;
this.STUD_ID = nextStudentId++;
}
public void display()
{
System.out.println("Student Id=" + STUD_ID + "\nStudent Name=" + student_name + "\nStudent Age=" + student_age + "\n");
}
public void showNextStudentId()
{
System.out.println("Next student id will be=" + nextStudentId + "\n");
}
protected void finalize()
{
--nextStudentId;
}
}
public class DisplayStudent {
public static void main(String[] args)
{
Student A = new Student("Mahesh", 31);
Student B = new Student("Ramesh", 45);
Student C = new Student("Suresh", 60);
A.display();
B.display();
C.display();
A.showNextStudentId();
B.showNextStudentId();
C.showNextStudentId();
{
Student X = new Student("Hitesh", 15);
Student Y = new Student("Pritesh", 18);
X.display();
Y.display();
X.showNextStudentId();
Y.showNextStudentId();
X = Y = null;
System.gc();
System.runFinalization();
}
A.showNextStudentId();
}
}
Output:
Student Id=1
Student Name=Mahesh
Student Age=31
Student Id=2
Student Name=Ramesh
Student Age=45
Student Id=3
Student Name=Suresh
Student Age=60
Next student id will be=4
Next student id will be=4
Next student id will be=4
Student Id=4
Student Name=Hitesh
Student Age=15
Student Id=5
Student Name=Pritesh
Student Age=18
Next student id will be=6
Next student id will be=6
Next student id will be=4