0

弱参照について読んでいます。
私はここから勉強するためにコードを使用しています。とても簡単です。

private void doFunction() throws InterruptedException {  
        Map<Integer, String> map = new HashMap<Integer, String>();   
        myMap = new WeakReference<Map<Integer, String>>(map);  
        map = null;   
        int i = 0;    
        while (true) {    
            if (myMap != null && myMap.get() != null) {  
                myMap.get().put(i++, "test" + i);   
                System.out.println("im still working!!!!");    
            }
            else {   

                System.out.println("*******im free at:"+i+"*******");  
                Thread.sleep(5000);  
                if(myMap != null){  
                    System.out.println("*******myMap is not null*******");  
                }  
            }           

    }    

小さなヒープサイズやを介して任意のサイズを要求しませんでし–Xms and –Xmxたが、のときにキャッシュから削除された値を確認できましたi == 15312
したがって、GC15312内のオブジェクトがMapエントリの削除を開始した後。
私の質問:メモリのあるものには15312低すぎませんか?参照が削除され始める前に、はるかに高い値を期待していました。 私はこれについて間違っていますか?オブジェクトが削除され始めるポイントをどのように評価できますか? 32 bit machine4 GB

4

1 に答える 1

2

重要なのはWeakReference、VM がいつガベージ コレクションを実行するかを気にしないことです。次に、VM は、メモリ フットプリントとパフォーマンス ミックスの観点から、VM が適切だと判断したことを実行します。

GC が 15312 個のオブジェクトの後にオブジェクトの収集を開始しているという事実は、単なる偶然かもしれません。GC の実装方法や構成方法にも依存します (JVM のバージョンが異なると、収集方法が異なる可能性があります)。繰り返しますがWeakReferences、 を使用している場合は、データがランダムな時点で収集されることを期待する必要があり、これが発生したときにそれを制御しようとする努力は無駄です。

いいえ、15312 は「4 GB のメモリを搭載した 32 ビット マシンでは低くありません。これは、VM が「メモリがいっぱいになる」よりもはるかに早く収集できるか、「メモリがいっぱいになるまで」収集できないためです。これは実装と構成に依存し、特定のアーキテクチャの特定の VM バージョンに対して、非常に具体的にターゲットを絞ったパフォーマンスの最適化を行っていない限り、これを変更しようとして費やした時間はおそらく無駄です。

于 2012-06-21T08:20:10.860 に答える