After which line will the object created at line XXX be eligible for garbage collection?
public Object getObject(Object a) //0
{ Object b = new Object(); //XXX
Object c, d = new Object(); //1
c = b; //2
b = a = null; //3
return c; //4
}
I think that all local variables become eligible for garbage collection when the block is finished.
A method is over after a return statement. So in line 4 method (just after) getObject is finished and all local variables become eligible for garbage collection.
An object may become garbage collected even before end of a method, which is what this question is getting at.
In other words, an object created locally is eligible to be GCed at the end of the method, but that is not necessarily the point where it becomes eligible. The point where an object becomes eligible for GC could be a lot earlier than that as well.
HTH,
Paul.
If you like our products and services, please help us by posting your review here.
admin wrote:.. could be a lot earlier than that as well...
agree, but back to the question: all options earlier doesn't fit. So .... ????
P.S
Correct answer: Never in this method.
My answer: after line 4
I see what you mean.
Technically, the objects become eligible after their references go "out of scope" (if there are no other references to them, of course). While it may seem like a return statement would end the scope, it is not so. The scope ends with a closing } and not with a return.
Therefore, "Never in this method" is the right option.
HTH,
Paul.
If you like our products and services, please help us by posting your review here.
1 more idea. "return c " pass an object outside the method (a link to an object).
After "}" all variables are marked to "destroy" but the object will live outside the method.
Probably it is correct explanation. what do you think?
Svetopolk wrote:1 more idea. "return c " pass an object outside the method (a link to an object).
After "}" all variables are marked to "destroy" but the object will live outside the method.
Probably it is correct explanation. what do you think?
Yes, that is correct and that is what the explanation already explains.
Note that at line 2, c is assigned the reference of b. i.e. c starts pointing to the object created at //XXX. So even if at //3 b and a are set to null, the object is not without any reference.
Also, at //4 c is being returned. So the object referred to by c cannot be garbage collected in this method!
If there is a reference, then there is no question. It just cannot be GCed.
Since you mentioned in your original post "all local objects". I was talking from the perspective where there is no reference to a local object. When is that collected - after return statement or after closing }?
If you like our products and services, please help us by posting your review here.
I agree with the answer: Never in this method.
But on the other hand the answer "Cannot be determined" is also correct because we actually don`t know from context where and when it will be eligible for garbage collection.
So there are two ambiguous answers.
Does it sound reasonable?
I get your point @inaelrodrigues. Honestly, I chose the same answer. For me, after line 3, the references a, b and c point to null, so the object itself is eligible for garbage collection from that point (line 3) and not later.
Well, the object will be available for GC only after the assignment b = a = null; is executed not before. If you say, at line //3, it could also mean just before b = a = null; because that is also technically line marked //3.
The point is, the whole statement b = a = null; is at line //3 so it would be incorrect to say that the object will be eligible for gc at that line. Only thing that is certain is that right after line //3, it will be eligible for GC.
HTH,
Paul.
If you like our products and services, please help us by posting your review here.
Sorry, I was looking at the wrong code. I checked this question again and the given answer I.e. "never in this method", is correct. Please go through the given explanation.
If you like our products and services, please help us by posting your review here.
I get your point @inaelrodrigues. Honestly, I chose the same answer. For me, after line 3, the references a, b and c point to null, so the object itself is eligible for garbage collection from that point (line 3) and not later.
Regards,
Guillaume
c doesn't point to null, it points to the object created in line XXX.
Can you tell me if this line creates 2 different objects (with c and d pointing to two seperate objects) or does this create just 1 object (with c and d pointing to the same object).
I think it creates 2 different objects and not 1. Am I correct?
public int getObject(Object a) //0
{
Object b = new Object(); //XXX
Object c, d = new Object(); //1
c = b; //2
b = a = null; //3
return 0; //4
} // 5
in this code, when is XXX eligible for garbage collection ? after line 5 ?
can you also tell me , once control is abruptly returned back after line 4 back to the caller, when actually is the scope of this method over ?
Scope of a method is always from opening bracket to closing bracket.
Object will be eligible to be GCed after line //4 itself. The difference between //4 and //5 is not important for the purpose of the exam.
If you like our products and services, please help us by posting your review here.
and one more clarification .
if instead of return c, if we had return (c=null);
then on this line itself the object would become eligible for garbage collection right ? i.e. after the expression (c=null ) is evaluated . since before the full statement return (c=null); is complete, when (c=null ) is evaluated itself its eligible for GC.