3

下に 2 つの関数があり、1 つは insert() で、もう 1 つは startGC() です。

最初に insert() メソッドを呼び出しますが、これには 300MB のヒープ スペースが必要です。その後、すべてのベクター オブジェクトが関数に対してローカルであるが発生していないため、ヒープに割り当てられたメモリを解放する必要がある startGC() を呼び出します。

private void insert()
 {
         Vector v=new Vector();
         Vector v1=new Vector();
         Vector v2=new Vector();
        String str="Hello";

        for (long i = 0L; i < 999999L; i++) {
            v.add(str + i);
            v1.add(str + i);
            v2.add(str + i);
        }
        v=null;
        v1=null;
        v2=null;
 }

private void startGC()
{
    System.gc();
}

私の質問:

1) この例でガベージ コレクションが機能しない理由。

2) JVM で未使用のメモリ ブロックをすべてガベージ コレクションする方法。

同じことを達成するためのコードサンプル。

4

6 に答える 6

7
  1. どのように機能していませんか?
  2. JVM にガベージ コレクションを開始するように指示することはできません。System.gc() を呼び出して、それが良い考えだと思うことを提案することしかできません。

JavaDocから:

gc メソッドを呼び出すということは、Java 仮想マシンが未使用のオブジェクトをリサイクルして、現在占有しているメモリをすばやく再利用できるようにすることを示唆しています。メソッド呼び出しから制御が戻ると、Java 仮想マシンは破棄されたすべてのオブジェクトからスペースを再利用するために最善を尽くしています。

于 2012-07-25T14:17:47.530 に答える
2

私が試したら

private static void insert() {
    List<String> v1 = new ArrayList<>(), v2 = new ArrayList<>(), v3 = new ArrayList<>();
    String str = "Hello";

    for (long i = 0L; i <= 999999; i++) {
        v1.add(str + i);
        v2.add(str + i);
        v3.add(str + i);
    }
}

private static void startGC() {
    System.gc();
}

private static long mbUsed() {
    return (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory())/1024/1024;
}

public static void main(String... args)  {
    startGC();
    System.out.printf("Memory used before insert %,d MB%n", mbUsed());
    insert();
    System.out.printf("Memory used after insert %,d MB%n", mbUsed());
    startGC();
    System.out.printf("Memory used after GC %,d MB%n", mbUsed());
}

それは印刷します

Memory used before insert 2 MB
Memory used after insert 265 MB
Memory used after GC 5 MB

だからそれは私のために働くようです。

于 2012-07-25T14:25:30.037 に答える
1

すでに述べたように、オブジェクトを削除するようにGCに提案することしかできません。あなたがするかもしれない唯一のことはheapmaxを設定することです(例えば:-Xmx512m)。この方法でgcの実行に影響を与えることができます。これはおそらくJavaの最大の欠点の1つです。本当にヒープが必要な場合は、アプリケーションのコンパイルにvmを使用しないcppなどの言語を使用する必要があります。

于 2012-07-25T14:33:35.447 に答える
1

これは、Java Garbage Collection の良い読み物です。

于 2012-07-25T14:20:10.343 に答える
1

コレクションを強制することはできません。これは間違ったアプローチです。JVM に渡すことができるさまざまなガベージ コレクション パラメーターを調べて、関心のあるパフォーマンスを最大化するパラメーターを選択する必要があります (全体のスループット、最小の一時停止など)。コード自体は、実際には gc を気にする必要はありません。

于 2012-07-25T14:25:52.843 に答える
1

JVM は、割り当てられたメモリをリサイクルしています。

OS に戻す必要はありません。

Java は、オブジェクトの割り当て解除後もシステム メモリを使用し、ガベージ コレクションがどのように機能するかを説明しているこの投稿をご覧ください。

于 2012-07-25T14:40:05.907 に答える