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 将根据内存占用和性能组合执行它认为是正确的事情。

GC 在 15312 个对象之后开始收集您的对象的事实可能只是一个巧合,它还取决于 GC 的实现和/或配置方式(不同版本的 JVM 可能会以不同的方式收集)。同样,如果您正在使用WeakReferences,您应该期望您的东西会在随机时间点被收集,并且尝试控制何时发生这种情况的努力是徒劳的。

所以不,15312 并不是“对于具有 4GB 内存的 32 位机器来说太低了,因为 VM 可以比“内存已满”更早地收集,或者它可以“直到内存已满”才收集 - 这是依赖于实现和配置,除非您正在执行非常具体的性能优化,否则在非常具体的使用场景中,对于特定架构上的特定 VM 版本,尝试更改它所花费的时间可能会被浪费。

于 2012-06-21T08:20:10.860 回答