繁体   English   中英

试图找出何时开始删除弱引用

[英]Trying to figure out when when weak reference starts to be removed

我正在阅读有关弱引用的内容。
我正在使用代码从这里学习。 这很简单。

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请求小堆大小或任何大小–Xms and –Xmx但是当i == 15312时, i == 15312能够看到从缓存中删除的值。
因此,在Map15312对象之后,GC开始删除条目。
我的问题:对于具有4 GB内存的32 bit machine15312是不是15312了? 在引用开始被删除之前,我期待更高的值。
我错了吗? 如何评估对象将在哪些点开始被删除?

WeakReference是你不关心 VM 什么时候会垃圾收集东西。 然后,虚拟机将在内存占用和性能组合方面做它认为正确的事情。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM