Critical error when showing and hiding stage or popup

Kevin Rushforth kevin.rushforth at oracle.com
Fri Sep 3 14:34:01 UTC 2021


I missed seeing the message yesterday. He did file a bug at 
bugreport.java.com, which ended up here:

https://bugs.openjdk.java.net/browse/JDK-8273319

I just evaluated it, and closed it as "not an issue". As I wrote in the 
bug report:

---------------------------------------------
"The test application is starving the event queue by running the show / 
hide in a tight loop on the JavaFX Application Thread. This means that 
no other operations, such as event processing, repainting the screen, or 
processing any queued messages, can occur. When a window is closed, we 
queue up an message to unregister the Window class to ensure that the 
class is no longer referenced before unregistering it (else it will 
fail). Since it is given no opportunity to run, we will leak and 
eventually run out of Windows class objects.

A modified test program that uses Platform.runLater to avoid starving 
the event queue does not encounter this problem. I ran it for about 
200,000 iterations of the loop with no problems, and verified that the 
Regisgter / Unregister Class methods are correctly balanced.

There *might* be something we could do to workaround this, but this is 
the result of a poorly behaved application test program. Instead, the 
application should be rewritten to not run code like this in a tight 
loop on the JavaFX Application Thread. I can't imagine the case where a 
real application would need to do what this stress test is doing."
---------------------------------------------

Do you have a non-pathological test case (meaning one where you don't 
show/hide in a loop) that shows this leak? If so, I can reopen the bug 
and we'll take a look.

-- Kevin


On 9/3/2021 6:50 AM, Nir Lisker wrote:
> I would submit it to bugreport.java.com.
>
> On Thu, Sep 2, 2021 at 9:08 PM Troels Skytte Kaspersen <trkas at eg.dk> wrote:
>
>> Hi,
>>
>> We have received many complaints from our customers that the popups are
>> not shown anymore after a period of time.
>>
>> I have then created a simple piece of code that result in the error our
>> customers get:
>>
>> package test;
>>
>> import javafx.application.Application;
>> import javafx.scene.Scene;
>> import javafx.scene.layout.StackPane;
>> import javafx.stage.Popup;
>> import javafx.stage.Stage;
>>
>> public class TestFX extends Application {
>>
>>              @Override
>>              public void start(Stage primaryStage) {
>>                           System.out.println("javafx.runtime.version: " +
>> System.getProperties().get("javafx.runtime.version"));
>>                           Stage stage = new Stage();
>>                           Scene scene = new Scene(new StackPane());
>>                           stage.setScene(scene);
>>                           stage.show();
>>                           Popup popOver = new Popup();
>>                           for (int i = 0; i < 99999; i++) {
>>                                       popOver.show(scene.getRoot(), 1, 1);
>>                                       popOver.hide();
>>                                       System.out.println(i);
>>                           }
>>              }
>>
>>              public static void main(String[] args) {
>>                           launch(args);
>>              }
>> }
>>
>> I use javafx 16+8
>>
>> If I run the code, it will result in error after various iterations:
>>
>> Exception in Application start method
>> Exception in thread "JavaFX Application Thread"
>> java.lang.NullPointerException
>>              at
>> javafx.base/com.sun.javafx.binding.ExpressionHelper.removeListener(ExpressionHelper.java:73)
>>              at
>> javafx.base/javafx.beans.property.ReadOnlyBooleanPropertyBase.removeListener(ReadOnlyBooleanPropertyBase.java:67)
>>              at
>> javafx.graphics/javafx.stage.PopupWindow.unbindOwnerFocusedProperty(PopupWindow.java:895)
>>              at
>> javafx.graphics/javafx.stage.PopupWindow.doVisibleChanged(PopupWindow.java:542)
>>              at
>> javafx.graphics/javafx.stage.PopupWindow$1.doVisibleChanged(PopupWindow.java:111)
>>              at
>> javafx.graphics/com.sun.javafx.stage.PopupWindowHelper.visibleChangedImpl(PopupWindowHelper.java:63)
>>              at
>> javafx.graphics/com.sun.javafx.stage.WindowHelper.visibleChanged(WindowHelper.java:77)
>>              at
>> javafx.graphics/javafx.stage.Window$12.invalidated(Window.java:1160)
>>              at
>> javafx.base/javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:110)
>>              at
>> javafx.base/javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:145)
>>              at
>> javafx.graphics/javafx.stage.Window.setShowing(Window.java:1187)
>>              at javafx.graphics/javafx.stage.Window.hide(Window.java:1212)
>>              at
>> javafx.graphics/javafx.stage.PopupWindow.hide(PopupWindow.java:486)
>>              at
>> javafx.graphics/javafx.stage.PopupWindow.lambda$new$0(PopupWindow.java:147)
>>              at
>> javafx.base/javafx.beans.value.WeakChangeListener.changed(WeakChangeListener.java:86)
>>              at
>> javafx.base/com.sun.javafx.binding.ExpressionHelper$SingleChange.fireValueChangedEvent(ExpressionHelper.java:181)
>>              at
>> javafx.base/com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
>>              at
>> javafx.graphics/javafx.scene.Node$TreeShowingPropertyReadOnly.invalidate(Node.java:8479)
>>              at
>> javafx.graphics/javafx.scene.Node.setTreeShowing(Node.java:8436)
>>              at
>> javafx.graphics/javafx.scene.Node.updateTreeShowing(Node.java:8427)
>>              at
>> javafx.graphics/javafx.scene.Node.lambda$new$2(Node.java:1010)
>>              at
>> javafx.base/com.sun.javafx.binding.ExpressionHelper$Generic.fireValueChangedEvent(ExpressionHelper.java:360)
>>              at
>> javafx.base/com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
>>              at
>> javafx.base/javafx.beans.property.ReadOnlyBooleanPropertyBase.fireValueChangedEvent(ReadOnlyBooleanPropertyBase.java:78)
>>              at
>> javafx.base/javafx.beans.property.ReadOnlyBooleanWrapper.fireValueChangedEvent(ReadOnlyBooleanWrapper.java:103)
>>              at
>> javafx.base/javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:111)
>>              at
>> javafx.base/javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:145)
>>              at
>> javafx.graphics/javafx.stage.Window.setShowing(Window.java:1187)
>>              at javafx.graphics/javafx.stage.Window.hide(Window.java:1212)
>>              at
>> javafx.graphics/com.sun.javafx.stage.WindowPeerListener.closed(WindowPeerListener.java:105)
>>              at
>> javafx.graphics/com.sun.javafx.tk.quantum.GlassWindowEventHandler.run(GlassWindowEventHandler.java:144)
>>              at
>> javafx.graphics/com.sun.javafx.tk.quantum.GlassWindowEventHandler.run(GlassWindowEventHandler.java:40)
>>              at
>> java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
>>              at
>> javafx.graphics/com.sun.javafx.tk.quantum.GlassWindowEventHandler.lambda$handleWindowEvent$4(GlassWindowEventHandler.java:176)
>>              at
>> javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:412)
>>              at
>> javafx.graphics/com.sun.javafx.tk.quantum.GlassWindowEventHandler.handleWindowEvent(GlassWindowEventHandler.java:174)
>>              at
>> javafx.graphics/com.sun.glass.ui.Window.handleWindowEvent(Window.java:1336)
>>              at
>> javafx.graphics/com.sun.glass.ui.Window.notifyDestroy(Window.java:1250)
>>              at
>> javafx.graphics/com.sun.glass.ui.win.WinWindow._close(Native Method)
>>              at
>> javafx.graphics/com.sun.glass.ui.Window.close(Window.java:352)
>>              at
>> javafx.graphics/com.sun.glass.ui.win.WinWindow.close(WinWindow.java:316)
>>              at
>> javafx.graphics/com.sun.glass.ui.Application.terminate(Application.java:394)
>>              at
>> javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.lambda$exit$13(QuantumToolkit.java:831)
>>              at
>> javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.runWithRenderLock(QuantumToolkit.java:430)
>>              at
>> javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.exit(QuantumToolkit.java:827)
>>              at
>> javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$tkExit$16(PlatformImpl.java:614)
>>              at
>> javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:474)
>>              at
>> javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:447)
>>              at
>> java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
>>              at
>> javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:446)
>>              at
>> javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
>>              at
>> javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
>>              at
>> javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
>>              at java.base/java.lang.Thread.run(Thread.java:831)
>> java.lang.reflect.InvocationTargetException
>>              at
>> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native
>> Method)
>>              at
>> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
>>              at
>> java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>>              at java.base/java.lang.reflect.Method.invoke(Method.java:567)
>>              at
>> javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464)
>>              at
>> javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363)
>>              at
>> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native
>> Method)
>>              at
>> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
>>              at
>> java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>>              at java.base/java.lang.reflect.Method.invoke(Method.java:567)
>>              at
>> java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1071)
>> Caused by: java.lang.RuntimeException: Exception in Application start
>> method
>>              at
>> javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900)
>>              at
>> javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
>>              at java.base/java.lang.Thread.run(Thread.java:831)
>> Caused by: java.lang.RuntimeException: could not create platform window
>>              at
>> javafx.graphics/com.sun.glass.ui.Window.<init>(Window.java:294)
>>              at
>> javafx.graphics/com.sun.glass.ui.win.WinWindow.<init>(WinWindow.java:54)
>>              at
>> javafx.graphics/com.sun.glass.ui.win.WinApplication.createWindow(WinApplication.java:219)
>>              at
>> javafx.graphics/com.sun.javafx.tk.quantum.WindowStage.initPlatformWindow(WindowStage.java:201)
>>              at
>> javafx.graphics/com.sun.javafx.tk.quantum.WindowStage.init(WindowStage.java:143)
>>              at
>> javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.createTKPopupStage(QuantumToolkit.java:678)
>>              at
>> javafx.graphics/javafx.stage.PopupWindow.doVisibleChanging(PopupWindow.java:514)
>>              at
>> javafx.graphics/javafx.stage.PopupWindow$1.doVisibleChanging(PopupWindow.java:107)
>>              at
>> javafx.graphics/com.sun.javafx.stage.PopupWindowHelper.visibleChangingImpl(PopupWindowHelper.java:57)
>>              at
>> javafx.graphics/com.sun.javafx.stage.WindowHelper.visibleChanging(WindowHelper.java:73)
>>              at
>> javafx.graphics/javafx.stage.Window$12.invalidated(Window.java:1065)
>>              at
>> javafx.base/javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:110)
>>              at
>> javafx.base/javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:145)
>>              at
>> javafx.graphics/javafx.stage.Window.setShowing(Window.java:1187)
>>              at javafx.graphics/javafx.stage.Window.show(Window.java:1202)
>>              at
>> javafx.graphics/javafx.stage.PopupWindow.showImpl(PopupWindow.java:472)
>>              at
>> javafx.graphics/javafx.stage.PopupWindow.show(PopupWindow.java:417)
>>              at test.TestFX.start(TestFX.java:35)
>>              at
>> javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
>>              at
>> javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:474)
>>              at
>> javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:447)
>>              at
>> java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
>>              at
>> javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:446)
>>              at
>> javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
>>              at
>> javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
>>              at
>> javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
>>              ... 1 more
>> Exception running application test.TestFX
>> B_
>>
>> I have tried javafx version down to javafx 11 and the error always occurs
>> at some point.
>>
>> I would consider this a very critical error. The workaround seems to just
>> set the opacity to 0 instead of hide(), but still I expect this code to run
>> until the end..
>>
>> Venlig hilsen / best regards
>>
>> Troels Skytte Kaspersen
>> Software Developer
>> ASPECT4 Development
>>
>> EG A/S ∙ Finsensvej 3 ∙ 7430 Ikast
>> T: +45 7013 2211 ∙ D: +45 7260 2235
>> F: +45 7013 2299 ∙ M: +45 2085 9209
>> E-mail: trkas at eg.dk<mailto:trkas at eg.dk> ∙ web: www.eg.dk<http://www.eg.dk>
>> Read our Privacy Policy<https://global.eg.dk/about-eg/treatment-of-data/>
>>



More information about the openjfx-dev mailing list