web-dev-qa-db-ja.com

javaの未使用の変数のメモリを削除します

Javaには独自のガベージコレクションがありますが、ガベージコレクションを手動で削除したい場合があります。そのような作業を行う方法はありますか? functionは多くの変数を宣言しますが、これは関数の最後で自動収集の代わりに使用した直後に未使用のメモリを削除することをお勧めしますか?手動でガベージを削除すると、アプリケーションの速度に影響しますか?助けてくれてありがとう!

36

Javaでメモリを解放する直接的な方法はありません。 persuadeを使用して、よく知られている方法を使用してオブジェクトを削除してください。

Object obj = new Object();
// use obj
obj = null;
System.gc();

しかし、これが実際にすぐにメモリを解放するという保証はありません。

これはヒープメモリに適用されますが、スタックに割り当てられたアイテムは、関数が戻るときにのみ解放できます。

36
Tudor

ゴミを「手動で」削除したいのはなぜですか?メモリが不足している場合は、Javaが実際にOutOfMemoryErrorをスローする前にガベージコレクションを実行することを思い出してください。メモリが本当に不足している場合は、あなたも手動で削除するためのゴミはありません。

変数を宣言しても、ヒープにメモリは割り当てられません。 newを使用してオブジェクトを作成します。 JVMは、スコープの外に出ていないがメソッドの終了前に使用されなくなったGCオブジェクト参照に対しても、分析をエスケープできます。

システムリソースが重要でない特定のポイントで積極的にメモリを解放したい場合は、並列GCアルゴリズムを使用するなど、より優れたJVMチューニングを使用してください。

物事をnullに設定して「手動で」ガベージコレクションを行うと、参照を無意味にnullにするコストを支払うか、必要以上にGCを呼び出すためだけに物事が遅くなります。

15
Sean Owen

System.gc(); を呼び出すことができます。これはmightで、ガベージコレクタをクリーンアップします。ただし、これがアプリケーションのパフォーマンスに影響することを確認してください。一般に、ここで何かを「最適化」しようとすることは意味がありません。

4
Kai

ガベージコレクターは通常、より良い仕事をするので、これを手動で行う価値はありません。また、自分でそれを行うことは、アプリケーションで顕著な違いを生む可能性が低いでしょう。

必要に応じて、変数参照をnullに設定し、System.gc()を呼び出すと、ガベージコレクターが手動で呼び出されます。

4
Oleksi

Nullを変数に割り当て、これらのオブジェクトへの参照がないことを確認してSystem.gc()を呼び出すことができますが、これはJVMがGCを呼び出すための提案にすぎませんが、保証はありません。ガベージコレクションcalを使用すると、アプリケーションのフリーズが遅くなります(世界のストップGC)。

3
dbf

非常に一般的な提案は、System.gc()Whichを使用することです。JVMは無視することを選択できます。たとえば、スコープを使用することもできます。

import Java.io.*;
public class AutoVariableTest
{
    public static void main(String[] args) throws Exception
    {
        String fileName = "test.txt";
        {// This is local block just to keep auto variable in check
            File file = new File(fileName); // file is not visible outside the scope and is available for garbage collection
            BufferedReader br = null;

            try{
                br = new BufferedReader(new FileReader(file));
                // ...
            }finally{
                if(br != null)
                    br.close();
            }
        }// local block end
    }
}
2
Favonius

特定のポイントの後に使用されるメモリの量を削減する場合は、変数に配列を使用して、不要になった配列をnullに設定することをお勧めします。この方法では、ガベージコレクターがすべてのデータをクリーンアップするのにかかる時間が大幅に短縮されます。

2
user2196966

メモリを管理しようとしている場合、Javaは適切ではありません。または、時間が長い場合は、JVMで独自のガベージコレクションメカニズムを記述します。

1
user691197