torutkのブログ

ソフトウェア・エンジニアのブログ

JavaFXのアニメーションで繰り返しを無制限にするとメモリリークの兆候が…

今年の4月にJJUG CCC 2015 Springで講演させていただいたJavaFXでアニメーションの題材であるアナログ時計を少しリファインしています(タッチパネル操作を主に)。

JavaFXとアナログ時計 - ソフトウェアエンジニアリング - Torutk

その際ヒープ使用量を計測してみたところ、見事にリークの兆候がありました。

以下が、数時間走らせたときのJConsoleで計測したヒープメモリの使用状況です。

以下は、ヒープのTenured領域の使用状況です。

これを見ると、時間の経過とともにold領域のインスタンスが増え、メジャーGCでも減らないように見えます。いわゆるメモリリークの兆候です。

しかし、これはJavaFXAPIリファレンスにしっかり注意書きがありました。

JavaFXのTimelineのjavadoc

Timelineを無限にした場合、適切に停止しないと、メモリー・リークが発生する可能性があります。

計測したコードは、次です。
https://github.com/torutk/analogclock/blob/b4c3e926384c24ff4be823584904492d986d97ad/AnalogClockSvg/src/analogclocksvg/AnalogClockController.java

 RotateTransition rt = new RotateTransition(duration, node);
  :
 rt.setCycleCount(Animation.INDEFINITE);

と、無限に繰り返し実行させています。

ということで、次はcycleCountを1回にして、毎回RotateTransitionを生成するようにしてメモリ使用状況を調べることとします。