[prev in list] [next in list] [prev in thread] [next in thread]
List: openjdk-openjfx-dev
Subject: Re: RFR: 8274022 fixing critical memory leak in the ControlAcceleratorSupport
From: Michael =?UTF-8?B?U3RyYXXDnw==?= <mstrauss () openjdk ! java ! net>
Date: 2021-10-31 16:39:07
Message-ID: TOf1L_Cd8L25xBunGQ-wdeKAwRRBWm3jsyoOtYs4VdM=.b58df7d1-b2a6-4423-b204-2d220d6ecfd0 () github ! com
[Download RAW message or body]
On Sat, 30 Oct 2021 10:56:40 GMT, Florian Kirmaier <fkirmaier@openjdk.org> wrote:
> This fixes the new ControlAcceleratorBug which was Introduced in JavaFX17.
> To fix it, I've made the Value of the WeakHashMap also weak.
> We only keep this value to remove it as a listener later on. Therefore there \
> shouldn't be issues by making this value weak.
>
> I've seen this Bug very very often, in the last weeks. Most of the applications \
> I've seen are somehow affected by this bug.
> It basically **breaks every application with menu bars and multiple stages** - \
> which is the majority of enterprise applications. It's especially annoying because \
> it takes some time until the application gets unstable.
> Therefore **I would recommend** after this fix is approved, **to make a new version \
> for JavaFX17** with this fix because this bug is so severe.
modules/javafx.controls/src/main/java/com/sun/javafx/scene/control/ControlAcceleratorSupport.java \
line 31:
> 29: import javafx.beans.property.ReadOnlyObjectProperty;
> 30: import javafx.beans.value.ChangeListener;
> 31: import javafx.beans.value.WeakChangeListener;
Minor: whitespace at the beginning of the line
modules/javafx.controls/src/main/java/com/sun/javafx/scene/control/ControlAcceleratorSupport.java \
line 88:
> 86: // Remove previously added listener if any
> 87: if (sceneChangeListenerMap.containsKey(anchor)) {
> 88: ChangeListener<Scene> listener = \
> sceneChangeListenerMap.get(anchor).get();
It seems unusual to check for the existence of a weak key (containsKey), and then \
just assume it still exists (get). You should probably get() the value directly \
without checking containsKey() first, and then check whether the returned value is \
null.
modules/javafx.controls/src/main/java/com/sun/javafx/scene/control/ControlAcceleratorSupport.java \
line 89:
> 87: if (sceneChangeListenerMap.containsKey(anchor)) {
> 88: ChangeListener<Scene> listener = \
> sceneChangeListenerMap.get(anchor).get();
> 89: if(listener != null) {
Minor: space before brace
modules/javafx.controls/src/main/java/com/sun/javafx/scene/control/ControlAcceleratorSupport.java \
line 254:
> 252: // at the time of installing the accelerators.
> 253: if (sceneChangeListenerMap.containsKey(anchor)) {
> 254: ChangeListener<Scene> listener = \
> sceneChangeListenerMap.get(anchor).get();
It seems unusual to check for the existence of a weak key (containsKey), and then \
just assume it still exists (get). You should probably get() the value directly \
without checking containsKey() first, and then check whether the returned value is \
null.
modules/javafx.controls/src/main/java/com/sun/javafx/scene/control/ControlAcceleratorSupport.java \
line 255:
> 253: if (sceneChangeListenerMap.containsKey(anchor)) {
> 254: ChangeListener<Scene> listener = \
> sceneChangeListenerMap.get(anchor).get();
> 255: if(listener != null) {
Minor: space before brace
-------------
PR: https://git.openjdk.java.net/jfx/pull/659
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic