Reputation: 171
I am working on the OCA Java certification and unsure of how to understand the answer to one question.
public class Test {
public static void main(String[] args){
Student s1 = new Student("o1");
Student s2 = new Student("o2");
Student s3 = new Student("o3");
s1=s3;
s3=s2;
s2=null;
//HERE
}
}
The question is which object will be available for garbage collection after the //HERE point.
The answer provided by the online test is : One object (o1).
Can someone explain me why?
Upvotes: 4
Views: 851
Reputation: 120848
Every time these kind of questions pop-up, the answer is still the same: after the comment HERE
, every single object is eligible for garbage collection. Nothing is used after that line, thus no strong reference exist to any object, thus everything is eligible for GC. Unfortunately, these kind of questions make sense only in the context of getting the correct "points" for the exam, thus people learn them the way they are. The reality is that without a broader context of reachability, they only confuse users, imo.
Think about - are there are any live references to any of your objects after that comment? No. As such, is every single instance eligible for GC? yes. And note that they are eligible after that comment, not after the methods ends. Do not mash scope an reachability together.
Upvotes: 4
Reputation: 1087
Consider a simple class Student.
Step 1 :
Student s1 = new Student("s1");
Student s2 = new Student("s2");
Student s3 = new Student("s3");
s1, s2, s3 are referencing 3 object in the heap space
Step 2 :
Student s1 = s3;
s1 is now referencing the s3 object in the heap space
the object s1 in the heap space has lost his reference
Step 3 :
Student s1 = s3;
Student s3 = s2;
Variable s1 reference s3 heap space
Variable s3 reference s2 heap space
Step 4 :
Student s1 = s3;
Student s3 = s2;
Student s2 = null;
Variable s1 reference s3 heap space
Variable s3 reference s2 heap space
Variable s2 lost his reference (null pointer)
Conclusion :
After line 11, one object is eligible for garbage collection
Upvotes: 7
Reputation: 99
After exiting the method all object will be eligible for garbage collection, since s1,s2,s3 are local variables and references are not passed outside.
However on the last line of the method, s1 holds reference to o3, s2 points to nowhere, s3 points to o2. Only o1 has no reference pointing on him, therefore it is eligible for garbage collection.
Upvotes: 1
Reputation: 2424
Student s1 = new Student("o1");
Student s2 = new Student("o2");
Student s3 = new Student("o3");
s1=s3; // The "s1" variable now points to the object referenced to by s3, ie "o3"
s3=s2; // The "s3" variable now points to the object referenced to by s2, ie "o2"
s2=null; // The "s2" variable points to nothing
At the end of the execution, objects "o3" and "o2" are referenced by variables ("s1" and "s3" respectively). As such, the object "o1" is not pointed to by any variable, and is available for destruction by the garbage collector.
Upvotes: 1