RFR: 6507038: Memory Leak in JTree / BasicTreeUI [v6]

Alexey Ivanov aivanov at openjdk.org
Wed Jan 31 17:30:06 UTC 2024


On Wed, 31 Jan 2024 05:39:11 GMT, Prasanta Sadhukhan <psadhukhan at openjdk.org> wrote:

>> When using a TreeCellRenterer which creates new components in getTreeCellRendererComponent() in a JTree that is not visible, changes to the nodes cause a memory leak.
>> When a node is changed, the Method getNodeDimensions() is called to calculate the new dimensions for the node. In this method, getTreeCellRendererComponent() is called to obtain the renderer component (what else...) and [this component is added to rendererPane](https://github.com/openjdk/jdk/blob/36f4b34f1953af736706ec67192204727808bc6c/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicTreeUI.java#L3283-L3284). It is not removed from the rendererPane afterwards. 
>> Only when the tree is painted, the paint() method does a removeAll on the rendererPane [in this code](https://github.com/openjdk/jdk/blob/36f4b34f1953af736706ec67192204727808bc6c/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicTreeUI.java#L1500)
>> 
>> FIx is added to remove the components from rendererPane when the JTree UI is changed/uninstalled only when tree is not visible since they are already removed when tree is painted in paint() method..
>
> Prasanta Sadhukhan has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Optimise test

Changes requested by aivanov (Reviewer).

src/java.desktop/share/classes/javax/swing/plaf/basic/BasicTreeUI.java line 3284:

> 3282:                 if(tree != null) {
> 3283:                     rendererPane.removeAll();
> 3284:                     // Only ever removed when UI changes, this is OK!

The comment no longer applies—you remove all the components from `rendererPane` on the line above.

test/jdk/javax/swing/plaf/basic/BasicTreeUI/TreeCellRendererLeakTest.java line 75:

> 73: 
> 74:         // Create a new JLabel every time
> 75:         public Component getTreeCellRendererComponent(

Suggestion:

        // Create a new JLabel every time
        @Override
        public Component getTreeCellRendererComponent(

test/jdk/javax/swing/plaf/basic/BasicTreeUI/TreeCellRendererLeakTest.java line 220:

> 218:     }
> 219: }
> 220: 

One blank line in the end of a file is enough.

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

PR Review: https://git.openjdk.org/jdk/pull/17458#pullrequestreview-1854359018
PR Review Comment: https://git.openjdk.org/jdk/pull/17458#discussion_r1473178234
PR Review Comment: https://git.openjdk.org/jdk/pull/17458#discussion_r1473181636
PR Review Comment: https://git.openjdk.org/jdk/pull/17458#discussion_r1473189670


More information about the client-libs-dev mailing list