I.e., in
class A {
public String s;
}
and
A a1 = new A();
a1.s = "bla";
A a2 = new A();
a2.s = a1.s;
a1 = null;
will a1
be garbage collected or is the reference to a1.s
permitting it from being collected (and I should rather do a deep copy, a2.s = new String(a1.s)
)?
Thanks a lot in advance!
If an
object
holds a reference of anotherobject
and when you set container object's referencenull
, child or containedobject
automatically becomes eligible for garbage collection.See this link for further information.
Here you are creating two references of
Object A
likea1
anda2
.First, you are assigning value of
a1
toa2
.So after setting value toa2
,a1
is allowed for GC. But there will be no change inreference a2
.You can also check this blog for Garbage Collection:
Since
A
has only a reference tos
,a2.s
pointing toa1.s
would not affecta1
's garbage collection.i.e
a1
is eligible for GC, but the object referred to bya2.s
(ora1.s
) will not be eligible for GC.The object A1 is eligible for GC as now it is set to be null. But as String "bla" in not available for GC because it also referred by a2.s. So only a1 object is available for GC.
If this is the case
then both a1 object and "bla" is available for GC. Because all references of "bla" is removed but now the case is
a2 is refering to same string "bla". So string is available in stringpool not for GC