Lightweight finalization for the JDK without any drawbacks was: Why is finalize wrong?
Jaroslav Tulach
jaroslav.tulach at oracle.com
Fri Aug 8 10:55:00 UTC 2014
Dne Pá 8. srpna 2014 10:01:14, Andrew Haley napsal(a):
> On 08/08/14 09:01, Jaroslav Tulach wrote:
> > Given the fact that WeakReference & co. has been introduced in JDK
> > 1.2 and that version was released at the end of 1998, I bet it was
> > just a communication problem, as Andrew must have been talking about
> > something else than WeakReference + ReferenceQueue behavior.
>
> You don't have to believe me, read this:
>
> http://thevirtualmachinist.blogspot.co.uk/2011/07/subtle-issue-of-reachabili
> ty.html
Interesting, but not really related. Maybe a topic for the memory management group
to require a receiver of an instance method call to be considered GC root while the
method is running.
Btw. if anyone really gets into problems described in the article, this:
byte[] getData() {
try {
return array.clone();
} finally {
Logger.getLogger("keep").log(Level.FINEST, "alive {0}", this);
}
}
is a way to prevent GC of this while the getData() method is running. My assumption
is that the Logger.log call is so polymorphic that it won't be possible for a VM to inline
it and/or optimize away - even it is usually a no-op.
-jt
PS: On a similar note: http://wiki.apidesign.org/wiki/CompilerOptimizations[1]
> http://thevirtualmachinist.blogspot.co.uk/2011/07/reachability-follow-up.ht
> ml
>
> The problem is not to do with WeakReferences or ReferenceQueues, but with
> the notion of reachability in the VM.
>
> The language which permits this behaviour is:
>
> "Optimizing transformations of a program can be designed that reduce
> the number of objects that are reachable to be less than those which
> would naively be considered reachable. For example, a Java compiler or
> code generator may choose to set a variable or parameter that will no
> longer be used to null to cause the storage for such an object to be
> potentially reclaimable sooner.
>
> "Another example of this occurs if the values in an object's fields
> are stored in registers. The program may then access the registers
> instead of the object, and never access the object again. This would
> imply that the object is garbage."
>
> Andrew.
--------
[1] http://wiki.apidesign.org/wiki/CompilerOptimizations
More information about the core-libs-dev
mailing list