45

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

4

8 に答える 8

55

Java でメモリを解放する直接的かつ即時の方法はありません。よく知られている方法を使用して、ガベージ コレクターにオブジェクトを取り除くよう説得することができます。

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

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

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

于 2012-07-04T14:18:30.037 に答える
18

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

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

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

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

于 2012-07-04T14:21:19.207 に答える
4

これを手動で行う価値はありません。通常はガベージ コレクターの方が適切に機能し、自分で行ってもアプリケーションに顕著な違いが生じる可能性は低いからです。

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

于 2012-07-04T14:19:45.917 に答える
4

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

于 2012-07-04T14:16:23.200 に答える
3

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

于 2013-03-21T21:06:52.367 に答える
3

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

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
    }
}
于 2012-07-04T14:22:45.947 に答える
3

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

于 2012-07-04T14:18:45.420 に答える
1

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

于 2012-07-04T14:29:41.327 に答える