RFR: 8273969: Memory Leak on the Lambda provided to Platform.startup

Kevin Rushforth kcr at openjdk.java.net
Mon Sep 20 13:43:24 UTC 2021

On Sun, 19 Sep 2021 15:33:46 GMT, Florian Kirmaier <fkirmaier at openjdk.org> wrote:

> Probably my most boring PR. ;)
> Setting the lambda to null, after it has been used, fixes the leak.

The fix looks obviously correct. I verified that the test catches the bug (fails without the fix and passes with the fix). I left a few cleanup comments on the test.

Btw, I almost left an additional test comment about needing to wait for the `Runnable` to be called (e.g., by waiting for a latch that is triggered in the `Runnable`), but I realized that this is unnecessary given that the test waits for the `Runnable` to be garbage-collected, which can't happen until after the `run` method of the `Runnable` has been called.

One last suggestion is that I recommend to change "Lambda" to "Runnable" in the title of the bug (and thus the PR).

tests/system/src/test/java/test/javafx/scene/PlatformStartupMemoryLeakTest.java line 26:

> 24:  */
> 25: 
> 26: package test.javafx.scene;

Similar tests are in the `test.com.sun.javafx.application` package, so I recommend putting this test there.

tests/system/src/test/java/test/javafx/scene/PlatformStartupMemoryLeakTest.java line 34:

> 32: public class PlatformStartupMemoryLeakTest {
> 33: 
> 34:     @Test

Since this test calls `Platform::startup`, this class must only have a single `@Test` method. I recommend adding a comment to that effect, so that someone doesn't try to add a second test method later.

tests/system/src/test/java/test/javafx/scene/PlatformStartupMemoryLeakTest.java line 37:

> 35:     public void testStartupLeak() {
> 36:         JMemoryBuddy.memoryTest((checker) -> {
> 37:             // Doesn't work as lambda for some reason, due to "BoundMethodHandle$Species_L"

Based on Tom's comment, and also my reading of the spec, this is expected (if somewhat counter-intuitive), so please modify this comment to indicate that the `Runnable` must not be turned into a lambda.

tests/system/src/test/java/test/javafx/scene/PlatformStartupMemoryLeakTest.java line 47:

> 45:             checker.assertCollectable(r);
> 46:         });
> 47:     }

I recommend adding an `@After` (or `@AfterClass`) cleanup method that calls `Platform::exit`.


PR: https://git.openjdk.java.net/jfx/pull/626

More information about the openjfx-dev mailing list