On 03/07/2013 11:09 PM, 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?
Another weird thing:
Consider this testcase:
public static void main (String[] args) {
Object obj = new Object();
ReferenceQueue queue = new ReferenceQueue();
Reference ref = new WeakReference(obj, queue);
obj = null;
System.gc();
// first approach
Reference ref1 = null;
while ( (ref1 = queue.poll()) == null ) {
System.out.println(ref1);
}
System.out.println(ref1);
// second approach
// Reference ref1 = null;
// do {
// ref1 = queue.poll();
// System.out.println("Polling the reference queue returns " +
// ref);
// } while (ref == null);
}
The first one results in an endless loop of null outputs
The second one returns immediately an reference
This with IBM JDK 6. With OpenJDK 6 I get the same result with both
approaches.
Thomas
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]