Testing no memory leak occurs via references

Roger Riggs roger.riggs at oracle.com
Fri Mar 3 18:25:55 UTC 2023


Hi,

There is test library class jdk.test.lib.util.ForceGC that is useful for 
that case.

It uses a PhantomReference to detect that gc has been run.
And it can be called with a function that can test for another condition.
For an example, look at the tests that use ForceGC in test/jdk/...

Regards, Roger


On 3/3/23 1:02 PM, Aleksei Ivanov wrote:
> Hello,
>
> In clientlibs, there's occasionally a need to verify an object isn't 
> leaked. For this purpose, WeakReference or PhantomReference is used.
>
> Then, we need to make the reference object be cleared, so a GC cycle 
> need to be triggered. The common approach is generating 
> OutOfMemoryError, catching it and verifying whether the reference is 
> cleared.
>
> Some tests use a utility method regtesthelpers/Util.generateOOME [1].
>
> For example, these tests follow the above approach:
> https://github.com/openjdk/jdk/blob/master/test/jdk/javax/swing/border/TestTitledBorderLeak.java
> https://github.com/openjdk/jdk/blob/master/test/jdk/java/awt/List/ListGarbageCollectionTest/AwtListGarbageCollectionTest.java
>
>
> The AwtListGarbageCollectionTest.java test started to fail pretty 
> often in the end of January 2023.
>
> I followed a piece of advice provided in a JBS comment for JDK-8300727 
> [2] and replaced generating OOME with a simple call to System.gc() 
> along with adding a loop for re-trying.
>
> The specification for System.gc() [3] mentions that this call can be 
> ignored, which started a discussion in the PR #12594 [4] that 
> System.gc() should not be used, at the very least without generating 
> OOME in addition to invoking System.gc().
>
> At the same time, many tests for Reference objects, such as 
> ReferenceEnqueue.java [5] and PhantomReferentClearing.java [6], rely 
> solely on System.gc.
>
>
> What would be your recommendation? Are there best practices in 
> core-libs and hotspot for testing for memory leaks that clientlibs 
> should follow?
>
>
> -- 
> Regards,
> Alexey
>
> [1] 
> https://github.com/openjdk/jdk/blob/29ee7c3b70ded8cd124ca5b4a38a2aee7c39068b/test/jdk/javax/swing/regtesthelpers/Util.java#L87
> [2] https://bugs.openjdk.org/browse/JDK-8300727
> [3] 
> https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/System.html#gc()
> [4] https://github.com/openjdk/jdk/pull/12594
> [5] 
> https://github.com/openjdk/jdk/blob/f612dcfebea7ffd4390f833646ad45d6f0ebd04f/test/jdk/java/lang/ref/ReferenceEnqueue.java#L54-L60
> [6] 
> https://github.com/openjdk/jdk/blob/f612dcfebea7ffd4390f833646ad45d6f0ebd04f/test/jdk/java/lang/ref/PhantomReferentClearing.java#L85-L92
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/core-libs-dev/attachments/20230303/0fb93572/attachment-0001.htm>


More information about the core-libs-dev mailing list