私はそのようなコードを持っています:
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" はフル ガベージ コレクターまでメモリに残ります。プログラム内のすべてのオブジェクトにアクセスできるかどうかをガベージ コレクターがチェックするのを待たずに、これらのオブジェクトをリアルタイムで削除する方法はありますか?