メモリリーク?
iMac の表示が乱れる
2023年11月から、最新の iMac M3 を診療で使用し始めたのだが、OpenDolphin を使い続けるうちに、ウインドウ内容が表示されなくなる現象が発生した。フレームは表示されるのだが、中身が表示されない。OpenDolphin を再起動すると直るが、しばらく使っていると再発する。その前に使っていた intel iMac では、見たことない現象であった。
さらに、この現象が起こっている際には、Safari の表示も乱れていることに気付いた。また、メモリ使用量も爆増していたが、それにしてはメモリプレッシャーは低いままで、矛盾している?ように思われた。
メモリ使用量の爆増はメモリリークの可能性がある。しかし、java の中にいる OpenDolphin が、Safari にまで影響を及ぼす可能性は考えにくいので、おそらくネイティブ側の問題かもしれないと考えて、OpenDolphin を時々再起動することで対応していた。その後、OS のアップデートが何回かあったが、この現象は解消されなかった。
Window#getOwnerlessWindows()
自前で何とかできないか検討するために、メモリ関連の数値をモニタしてみた。-Xmx は設定していなかったので、iMac のヒープはデフォルト値で、十分余裕がある状態であった。さらに調べていくうちに、Window#getOwnerlessWindows() というメソッドを見つけた。OwnerlessWindows というのは一体、ガベージコレクション (GC) される運命の Window ?なのかもしれない。試しにこの Window の数をモニタしてみたところ、数値がどんどん増えていって、値が 200を越えたくらいで、画面表示が乱れることがわかった。
Window 関連のリファクタリング
内部の方で OwnerlessWindows の GC がうまく行っていない可能性を考えて、Window 関連のコードをリファクタリングしてみた。GC にひっかかりやすくなるかと思って、使い終わったら、リスナの除去、dispose、null を代入というのを徹底した。どこが効いたのかよく分からないが、OnwerlessWindows の増加を大幅に減少させることができて、1日再起動しなくても診療終了できるようになった。