试图弄清楚何时开始删除弱引用



我正在读关于弱引用的文章
我正在使用代码从这里学习。这很简单。

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时看到从缓存中删除的值
因此,在Map中的15312对象之后,GC开始删除条目
我的问题是:对于具有4 GB内存的32 bit machine来说,15312不是太低了吗?在引用开始被删除之前,我期望有一个更高的值
我错了吗?如何评估对象将在哪些点开始移除?

WeakReference的要点是,不在乎VM何时垃圾收集这些东西。然后,虚拟机将做它认为在内存占用方面是正确的事情&性能组合。

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

所以不,15312对于一台具有4GB内存的32位机器来说并不"低",因为虚拟机可能比"内存满时"更早收集,或者它可能"永远不会收集,直到内存满"-这取决于实现和配置,除非您在一个非常特定的使用场景中,针对特定架构上的特定VM版本,进行非常有针对性的性能优化,否则尝试更改这一点可能会浪费时间。

相关内容

  • 没有找到相关文章

最新更新