[Rev 01] RFR: 8241840: Memoryleak: Closed focused Stages are not collected with Monocle.

Ambarish Rapte arapte at openjdk.java.net
Fri Apr 17 13:00:20 UTC 2020


On Tue, 14 Apr 2020 10:47:55 GMT, Florian Kirmaier <fkirmaier at openjdk.org> wrote:

>> tests/system/src/test/java/test/javafx/stage/FocusedWindowTest.java line 77:
>> 
>>> 76:         Platform.runLater(() -> stage.close());
>>> 77:     }
>>> 78:
>> 
>> Looks like the primary `stage` is not required for actual test, and this block is only used to initialize JavaFX
>> runtime. Please check if it can be replaced by below block
>>     ```
>>     @BeforeClass
>>     public static void initFX() throws Exception {
>>             startupLatch = new CountDownLatch(1);
>>             Platform.startup(startupLatch::countDown);
>>             Assert.assertTrue("Timeout waiting for FX runtime to start",
>>                     startupLatch.await(15, TimeUnit.MILLISECONDS));
>>     }
>
> This version doesn't work for me.
> With this change, I get the following error:
> test.javafx.stage.FocusedWindowTest > testLeak FAILED
>     junit.framework.AssertionFailedError: Exceeded timeout limit of 10000 msec
>         at test.util.Util.runAndWait(Util.java:163)
>         at test.util.Util.runAndWait(Util.java:134)
>         at test.javafx.stage.FocusedWindowTest.testLeak(FocusedWindowTest.java:82)

This is happening because after the last stage is closed JavaFX runtime shuts down implicitly unless specified
otherwise using `Platform.setImplicitExit(false);`. So `initFX()` should look as,
   ```
@BeforeClass
    public static void initFX() throws Exception {
        startupLatch = new CountDownLatch(1);
        Platform.startup(startupLatch::countDown);
        Platform.setImplicitExit(false);
        Assert.assertTrue("Timeout waiting for FX runtime to start",
                startupLatch.await(15, TimeUnit.MILLISECONDS));
    }

>> tests/system/src/test/java/test/javafx/stage/FocusedWindowTest.java line 53:
>> 
>>> 52:         System.setProperty("monocle.platform","Headless");
>>> 53:     }
>>> 54:
>> 
>> The test will always run with Monocle. I see that if this static block is removed then the test fails on Windows 10.
>> Can you please verify all the platforms and change the test such that it runs on all platforms/ combinations.
>
> I wasn't able to reproduce the Problem on Window10 with VirtualBox.
> 
> How should I do it? Add a second test class without the static code? Do you have a good recommendation on how to add it?

The previous version of test failed on my Windows 10 machine with below exception, but the updated version does not
fail,

test.javafx.stage.FocusedWindowTest > testLeak FAILED
    junit.framework.AssertionFailedError: Expected: <null> but was: javafx.stage.Stage at 5fe60662
        at junit.framework.Assert.fail(Assert.java:47)
        at junit.framework.Assert.assertTrue(Assert.java:20)
        at junit.framework.Assert.assertNull(Assert.java:233)
        at junit.framework.Assert.assertNull(Assert.java:226)
        at test.javafx.stage.FocusedWindowTest.assertCollectable(FocusedWindowTest.java:133)
        at test.javafx.stage.FocusedWindowTest.testLeakOnce(FocusedWindowTest.java:116)
        at test.javafx.stage.FocusedWindowTest.testLeak(FocusedWindowTest.java:84)

-------------

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


More information about the openjfx-dev mailing list