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 <tr...@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: tr...@eg.dk<mailto:tr...@eg.dk> ∙ web: www.eg.dk<http://www.eg.dk>
Read our Privacy Policy<https://global.eg.dk/about-eg/treatment-of-data/>


Reply via email to