JavaFXで時間管理タイマーを作る [メモリリーク編]
(上から2つ目のプロセスです)
しばらく使ってたんですけど、なんか妙にメモリ食うんですよねこれ。起動時から100MBくらい使うし3時間位でこうなるし。
というわけで原因を探してたんですけど、こんな記事を見つけました。
ドキュメントにもしっかりその旨が書いてあるらしく
警告: 実行中のTimelineはFXランタイムから参照されます。Timelineを無限にした場合、適切に停止しないと、メモリー・リークが発生する可能性があります。アニメーション化されるプロパティを持つすべてのオブジェクトがガベージ・コレクションの対象となるわけではありません。
だそうです。
コード
追加部分を抜粋すると
public class Controller implements Initializable { private int c = 0; private Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(1), //時間経過をトリガにするのはTimelineクラスを使う new EventHandler<ActionEvent>() { public void handle(ActionEvent actionEvent) { //ここに書いた処理がDuration.seconds(1)で示した感覚で実行される c++; if (c > 60){ c = 0; timeline.stop(); timeline.play(); } } } ) ); public void mainButtonClick(ActionEvent actionEvent) { if (mainTimer.getStatus()){ //タイマーが動作中のクリック }else { //タイマーが動作していない timeline.setCycleCount(100); //何回繰り返すか指定する } }
何回呼ばれたか数えるカウンタを用意して、一定回数(60回)呼ばれたら停止して再開すると言った形にしました。
非常に頭の悪い感じになりましたが、これで治るのか楽しみですね