RFR: 6507038: Memory Leak in JTree / BasicTreeUI

Prasanta Sadhukhan psadhukhan at openjdk.org
Tue Jan 23 05:00:26 UTC 2024


On Mon, 22 Jan 2024 18:25:29 GMT, Alexey Ivanov <aivanov 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..
>
> src/java.desktop/share/classes/javax/swing/plaf/basic/BasicTreeUI.java line 1338:
> 
>> 1336:         if(rendererPane != null) {
>> 1337:             if (!tree.isVisible()) {
>> 1338:                 rendererPane.removeAll();
> 
> Wouldn't it be enough to remove `rendererPane` from and assign `null` to it?
> 
> It's done this way in `BasicTableUI` and `BasicListUI`:
> https://github.com/openjdk/jdk/blob/0d8543d6773a516dad54038070dce507179d0709/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicTableUI.java#L1656-L1658
> and
> https://github.com/openjdk/jdk/blob/0d8543d6773a516dad54038070dce507179d0709/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicListUI.java#L986-L988

It is already been done in `completeUIUninstall` called from `uninstallUI`
`rendererPane.removeAll `is done to remove all components that are added in `getNodeDImensions` which gets removed in `paint` but if tree is not visible, then `paint `is not called so those components are not removed, which I am trying to do now in `uninstallUI `by checking tree visibility condition

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

PR Review Comment: https://git.openjdk.org/jdk/pull/17458#discussion_r1462726516


More information about the client-libs-dev mailing list