音楽や動画GIFを扱う際の注意点
javax.sounndパッケージではMIDIやWAVEを取り扱うことができる。
動画GIFはjava.awtの辺りで取り扱っていたと思う。
(何年も前に試してたので、記憶が・・・)
この動きのあるものは、実は、裏でスレッドとして動いている。
スレッドで動いていることを知らないと、思わぬ落とし穴に遭うことになる。
スレッド自体は、動きを実現するために(画像を変更する/音楽を鳴らすために)
存在しているものと思われる。
(そういう仕組みであることを知らなかった…)
MIDIオブジェクトなどを、closeせずに、
そのまま次のオブジェクトを生成すると、元々のMIDIオブジェクトが生き残ったままとなる。
スレッドも残ったままとなる。(複数スレッド存在する状態となる)
スレッドと対象オブジェクト位が残る分には、問題ないレベルかもしれないが、
それに関連する(紐ついた)オブジェクトも生きていると判断され、GC対象とはならずに、他の多数のオブジェクトがメモリから消えない状態となる。
つまり、メモリリーク状態となる。
深刻になると、OutOfMemoryErrorが発生する。
実はSKK3.1FXを作成する際に、分かったことである。
つまり、SKK3.1(Graphics2D版)も同様の現象が起きている。
(問題は出にくいが、修正する予定です)
SKK3.1FXでは、実際にOutOfMemoryErrorが発生した。
JavaFX版は、メモリ消費量がGraphics2D版に比べて、高い傾向にある。
(こちらは別途、覚え書きを書くかも)
そのためJavaFXは、OutOfMemoryErrorが発生する確率が高かった。(他の要因もあるかも。他も修正しているので)
3周目に突入すると、異様に遅くなり、最後はメモリを食い潰してしまった。
まとめると、
スレッドが作成されているもののクラスの取り扱いは注意が必要である。
ちなみにJavaFXでは専用のスレッドで管理しているため、改善しているものと思われる。
(もう少し追記)
javax.sounnd等はJavaFXの仲間ではない。Javaの拡張機能の模様。
独自のスレッドを作成している。