このステートメントはwhileループにありますが、Windowsタスクマネージャーでは、Javaアプリプロセスによって使用されるメモリが毎秒約数k増加し続けていることに気付きました。String.formatにメモリの問題はありますか?
String str = String.format("%dDays %02d : %02d : %02d",days,hours,minutes,seconds);
このステートメントはwhileループにありますが、Windowsタスクマネージャーでは、Javaアプリプロセスによって使用されるメモリが毎秒約数k増加し続けていることに気付きました。String.formatにメモリの問題はありますか?
String str = String.format("%dDays %02d : %02d : %02d",days,hours,minutes,seconds);
それ以降どこも使用していない場合はstr
、ガベージコレクターが実行されていないため、解放する必要のあるメモリがまだ収集されていません。これはおそらく、Javaがメモリの再利用を開始する前に一定量のメモリを使用する必要があるため(予約ページが残っているため)、Javaがそれを必要としないためです。ガベージコレクタの実行はコストのかかる作業です。
作成した文字列への参照を保持していないと仮定します。
基本的に、その呼び出しは実行されるたびに新しいオブジェクトを作成します。これらのオブジェクトは、Java仮想マシンがガベージコレクションの実行を決定するまでメモリに残ります。JVMは、必要であると判断するまでそうしません。通常、必要なのは、メモリ使用量が特定のしきい値を超えた場合です。そのしきい値は、マシンとJVMが開始された設定によって異なります。
次のようなことをすると役立ちます。
String days = "Monday";
String hours = "10:00pm";
String minutes = "60";
String seconds = "01";
while(condition){
String str = String.format("%dDays %02d : %02d : %02d",days,hours,minutes,seconds);
}
これにより、ループ内の各反復の文字列ごとに 32 ビットを使用する代わりに、文字列への参照が渡されます。ループ内の文字列を決定することができない場合は、使用するメモリの量を減らす文字またはバイト (可能であれば) に切り替えてみてください。
ガベージ コレクターを強制的に実行したい場合 (非常に安全ではありません)、ここを参照してください。
http://stackoverflow.com/questions/1481178/forcing-garbage-collection-in-java