On Tue, 15 Jul 2025 20:24:36 GMT, Sergey Bylokhov <[email protected]> wrote:
>> Eliminate a finalize() method in the Swing macOS implementation.
>>
>> I tested that the dispose method is being called by running this small test
>> in combination with some 'println' statements in the source code (now
>> removed)
>>
>> import javax.swing.JTabbedPane;
>> import javax.swing.plaf.TabbedPaneUI;
>>
>> public class CreateTabbedPaneUIStressTest {
>>
>> public static void main(String[] args) {
>> for (int i=0; i<1000000000; i++) {
>> JTabbedPane jtp = new JTabbedPane();
>> TabbedPaneUI tpui = jtp.getUI();
>> }
>> }
>> }
>>
>>
>> I also monitored the process size using 'top'.
>> And when I commented out the native call that did the free and re-tested I
>> saw process size grow.
>>
>> Turning the above into a useful regression test doesn't seem possible to me.
>> Limiting Java heap is pointless (and I did use -Xmx20m) since it is a native
>> resource that is to be freed and failure to dispose won't show up as a
>> problem without taking down the machine.
>
> src/java.desktop/macosx/classes/apple/laf/JRSUIControl.java line 115:
>
>> 113: flipped = other.flipped;
>> 114: cfDictionaryPtr = getCFDictionary(flipped);
>> 115: if (cfDictionaryPtr == 0) throw new RuntimeException("Unable to
>> create native representation");
>
> Just a side topic to discuss: In the past I tried to look into this pattern
> and figure out is it possible for the GC to start cleaning the object after
> we allocate the native resource but before we register it with
> Disposer.addRecord. In such a case, the cleanup might never be executed.
>
> Perhaps we should consider adding a reachabilityFence at the end of
> Disposer.addRecord, for both the DisposerRecord and the referent, to ensure
> they remain reachable. Similarly how it was done for cleaner:
> https://hg.openjdk.org/jdk9/jdk9/jdk/rev/1f33e517236e
> Or may be we can just use cleaner.
there is even a bug for Cleaner that the reachabilityFence should be moved to
the end of register:
https://bugs.openjdk.org/browse/JDK-8291867
If there are no objectiosn I'll add it to the Disposer.addRecord in a separate
bug.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/26331#discussion_r2208767482