yamaken1343’s blog

技術ブログもどき

JavaFXで時間管理タイマーを作る [メモリリーク編]

yamaken1343.hatenablog.jp

f:id:yamaken1343:20180501131610p:plain

(上から2つ目のプロセスです)

しばらく使ってたんですけど、なんか妙にメモリ食うんですよねこれ。起動時から100MBくらい使うし3時間位でこうなるし。

というわけで原因を探してたんですけど、こんな記事を見つけました。

d.hatena.ne.jp

ドキュメントにもしっかりその旨が書いてあるらしく

Timeline (JavaFX 8)

警告: 実行中の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回)呼ばれたら停止して再開すると言った形にしました。

非常に頭の悪い感じになりましたが、これで治るのか楽しみですね