2017-01-05 7 views
0

ビデオファイルを再生するJavaFXプログラムがあります。私たちが抱えている問題は、ビデオファイルがメモリにロードされて再生されるとき、次のビデオファイルが再生されるときにアンロードされないということです。問題は、一定量のビデオが再生された後、メモリがいっぱいになり、マシンが完全なメモリから悲鳴を滅する停止になることです。Java - メモリからメディアをアンロード

私たちは、64ビットバージョンのプログラムをビルドしようとしましたが、その利点はありません。

+2

コードを表示していないと、このバグを見つける手助けができません。 –

答えて

1

Javaはデフォルトでガベージコレクタではなく、マークスイープ型のガベージコレクタを使用します。つまり、古いビデオへの参照をすべて削除すると、ビデオはメモリからアンロードされず、Javaランタイムはガベージコレクタを呼び出す前に一定量のメモリがプログラムによって使用されるまで待機します。これらのパラメータは、Javaコマンドラインで設定されるか、またはプラットフォームごとにデフォルトで設定されます。あなたのJavaガーベジコレクションのパラメータが高すぎるように設定されているように見えます。その結果、マシンのすべてのメモリを消費する前にJavaがガベージコレクトを実行しません。

は、あなたのプログラムを実行するには、あなたのJAVA_OPTS環境変数に以下を前に追加し、メモリの最大量を設定するには:

-verbose:gc -Xmx1200m 

最初のものは、ガベージコレクタで何が起こっているか、二番目のことを教えてくれますJavaが使用するメモリの最大量を設定します。この場合、1.2ギガバイトです。マシンの総メモリの何割かに設定しますが、ビデオをメモリに読み込むのに十分な大きさに設定してください。

また、低ガベージコレクションの遅延を維持するために

-XX:+UseG1GC 

を追加したい場合があります。ガベージコレクトの10秒間の遅延を防ぐために、これはある程度の究極のパフォーマンスを犠牲にしています。今日のマシンは非常に高速であり、インタラクティブなプログラムではG1GCの減速に気付くよりもガベージコレクションの遅延がはるかに大きいことがわかります。

また、新しいビデオがロードされるとすぐに、古いビデオへのすべての参照を削除するようにします。それ以外の場合、アクセス可能な参照がある場合、ガベージコレクタによってアンロードされません。

+0

親切にありがとう!!!! – technotommy

関連する問題