JavaFXのアニメーションで繰り返しを無制限にするとメモリリークの兆候が…
今年の4月にJJUG CCC 2015 Springで講演させていただいたJavaFXでアニメーションの題材であるアナログ時計を少しリファインしています(タッチパネル操作を主に)。
JavaFXとアナログ時計 - ソフトウェアエンジニアリング - Torutk
その際ヒープ使用量を計測してみたところ、見事にリークの兆候がありました。
以下が、数時間走らせたときのJConsoleで計測したヒープメモリの使用状況です。
以下は、ヒープのTenured領域の使用状況です。
これを見ると、時間の経過とともにold領域のインスタンスが増え、メジャーGCでも減らないように見えます。いわゆるメモリリークの兆候です。
しかし、これはJavaFXのAPIリファレンスにしっかり注意書きがありました。
Timelineを無限にした場合、適切に停止しないと、メモリー・リークが発生する可能性があります。
RotateTransition rt = new RotateTransition(duration, node);
:
rt.setCycleCount(Animation.INDEFINITE);
と、無限に繰り返し実行させています。
ということで、次はcycleCountを1回にして、毎回RotateTransitionを生成するようにしてメモリ使用状況を調べることとします。