Path: csiph.com!v102.xanadu-bbs.net!xanadu-bbs.net!us.feeder.erje.net!feeder.erje.net!eu.feeder.erje.net!news.swapon.de!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: v_borchert@despammed.com (Volker Borchert) Newsgroups: comp.lang.java.programmer Subject: Re: finalize() not called. Date: 4 Dec 2014 19:05:23 GMT Organization: Private site at Eddersheim, Germany Lines: 26 Distribution: world Message-ID: References: <850b3ab9-57ea-490c-a165-943183169841@googlegroups.com> X-Trace: individual.net R9P6ch1LilxEMe2g8AJs+AzExTQeLWqOiyYfkYEEvM9v/XZJr0 Cancel-Lock: sha1:I84CehEXTry2nJIYlCAKd8JDmG8= Xref: csiph.com comp.lang.java.programmer:30487 somenathpal@gmail.com wrote: > Now when System.gc() is called I expect finalize() to be called. > But it does not get called. But when I uncomment the following > System.out.println("Calling GC"); the finalize() gets called. > I am not able to understand this behavior. I was expecting > finalize() method yo be called. RTFB (= Read The Fine Book ;-), in this case, "Effective Java" item #7 (in the 2nd edition) on why finalizers have been a really bead idea right from the beginning, but for reasons probably just not yet understood all those years ago. Basically, there are no guarantees as to when, on which thread, and whether at all finalizers are called. If you need to make sure that locks are released or resources freed, put the release or free into finally blocks. If you are just curious to know when objects are GCed, or want to do non-urgent bookkeeping like eventually removing the map entries for GCed keys or values from a cache, use PhantomReference in cunjonction with ReferenceQueue. -- "I'm a doctor, not a mechanic." Dr Leonard McCoy "I'm a mechanic, not a doctor." Volker Borchert