Hi Thomas,

Thomas Neidhart wrote:

> Hi,
> 
> I have installed the following JDK on my machine:
> 
> java version "1.6.0"
> Java(TM) SE Runtime Environment (build pxi3260sr12-20121025_01(SR12))
> IBM J9 VM (build 2.4, JRE 1.6.0 IBM J9 2.4 Linux x86-32
> jvmxi3260sr12-20121024_126067 (JIT enabled, AOT enabled)
> J9VM - 20121024_126067
> JIT  - r9_20120914_26057
> GC   - 20120928_AA)
> JCL  - 20121014_01
> 
> When I try to run the following test from the IBM developerworks wrt
> WeakReferences and ReferenceQueue, the reference is never put on the
> reference queue (the problem that I also had in the WeakHashtable
> testcase):
> 
> url: http://www.ibm.com/developerworks/library/j-refs/
> 
> output:
> 
> Example of incorrectly holding a strong reference
> object is MyObject@3b203b2
> The weak reference is java.lang.ref.WeakReference@46d046d
> Polling the reference queue returns null
> Getting the referent from the weak reference returns MyObject@3b203b2
> Calling GC
> Polling the reference queue returns null
> Getting the referent from the weak reference returns null
> 
> Example of correctly releasing a strong reference
> object is MyObject@2bd62bd6
> The weak reference is java.lang.ref.WeakReference@37c637c6
> Polling the reference queue returns null
> Getting the referent from the weak reference returns MyObject@2bd62bd6
> Set the obj reference to null and call GC
> Polling the reference queue returns null
> Getting the referent from the weak reference returns null
> In finalize method for this object: MyObject@3b203b2
> In finalize method for this object: MyObject@2bd62bd6
> 
> 
> Polling the reference queue always returns null, even when the
> WeakReference has lost its referent.
> 
> Can somebody confirm this?

IMHO the test is incorrect. I remember another article about the GC and it 
was stated, that the GC cannot garbage collect objects with a finalizer 
method immediately. It will keep such objects in a special area and return 
them to the queue at its next run when the finalizer has been finished (and 
therefore it is counter-productive to implement that method). That article 
might have been explained GC strategies of newer JDKs (6/7) while this IBM 
article is ancient. With the original test I face a 50% chance that the 
finalizer method runs after polling the queue. IMHO you should modify the 
test to call the GC twice in a row to get proper results for modern GCs. At 
least then I have the expected effect for my IBM 4/5/6 JDKs (amd64-64). 

Funny enough it does not work for my Oracle JDK 7, actually you cannot rely 
at all to System.gc() calls, because you have no idea about the JDKs GC 
strategy. ;-)

- Jörg


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org

Reply via email to