我正在阅读有关弱引用的信息。
我正在使用代码从here学习。这很简单。

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

最佳答案

WeakReference的要点是,您不在乎VM何时会垃圾收集内容。然后,VM将根据内存占用空间和性能组合执行其认为正确的操作。

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

因此,否,15312并非“对于具有4GB内存的32位计算机而言很低,因为VM可以比“内存已满”收集得更早,或者它可以“直到内存已满才收集”。取决于实现和配置,并且除非您进行非常有针对性的性能优化,否则在特定的使用场景中,对于特定体系结构上的特定VM版本,可能会浪费时间来更改它。

07-27 23:09