0

私はそのようなコードを持っています:

public static class Obj {//Class within class
Long a;

}

private static final Map<String, Obj> map = new ConcurrentHashMap<>();

public static void main(String[] args)
{
    for(long l = 0;l<10000090L;l++)
    {
        Obj o = new Obj();
        o.a = l;
        map.put("asd", o);
        map.remove("asd");
    }
}

私のPCでは、このコードをスレッドに追加したので、メモリ使用量を簡単に確認できます。Your Kit Java Profiler でプロファイリングを開始しました。

VM に追加の引数を追加しました: -XX:+UseConcMarkSweepGC -XX:+UseTLAB -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing

このプログラムをテストした私の結果: ループ前にキットが表示されている - ユーザー パー サービス スペース 0 バイト、ユーザー パー Eden スペース 12 mb、使用済み CMS 古い世代 0 バイト 戦利品の後 キットが表示されている - ユーザー パー サービス スペース 8 KB、ユーザー パーEden Space 38 mb、使用済み CMS Old Gen 0 Bytes 1,6 mb

次に、ガベージコレクターを強制しました。結果:キットが表示されます-ユーザーパーサービススペース0バイト、ユーザーパーエデンスペース1,4 mb、使用CMS Old Gen 1,5 mb

したがって、この値を正しく読み取れば、Obj または "asd" はフル ガベージ コレクターまでメモリに残ります。プログラム内のすべてのオブジェクトにアクセスできるかどうかをガベージ コレクターがチェックするのを待たずに、これらのオブジェクトをリアルタイムで削除する方法はありますか?

4

2 に答える 2

2

ガベージ コレクターは、必要なときにすぐに実行されます。ほとんどの場合、最も最適化されたタイミングで実行されます。手動で GC を使用してトリガーするように要求してSystem.gc()も、まったく利点がない可能性があります。

さらに、「abj」が完全なGCまで留まっているかどうかをどのように知るのですか. あなたの eden 世代は 38 MB のスペースを占有し、古い世代では 0 MB を占有しています。あなたの場合、寿命の短いオブジェクトのみが予想される動作です(通常、小さなGCは、非常に速い速度で挿入し、edenがすぐにいっぱいにならない限り機能するはずです)

于 2013-10-31T17:49:23.503 に答える