簡體   English   中英

有沒有一種方法可以測試何時從弱集合中刪除元素?

[英]Is there a way to test when an element is removed from a weak set?

在以下代碼段(其唯一目的是教育測試)中, contains()始終為true。

    Set<String> weakSet = Collections.newSetFromMap(new WeakHashMap<>());
    weakSet.add("someKey");
    System.gc();
    weakSet.contains("someKey");

我希望JVM回收空間的最大努力包括刪除只能弱訪問的對象(弱集合元素,而無需任何強引用)。 但是我錯了。

那么,有沒有一種方法可以在實踐中測試自動刪除弱引用,以便您可以看到引用消失了? 換句話說,如何讓contains()返回false?

正如@Chai T.Rex在評論中正確提到的那樣,字符串是垃圾收集的不好例子。 要查看如何從弱集垃圾收集對象,請嘗試使用此修改后的代碼版本:

    Set<Object> weakSet = Collections.newSetFromMap(new WeakHashMap<>());
    weakSet.add(new Object());
    System.out.println(weakSet.size()); // prints "1"
    while (weakSet.size() > 0)
        System.gc();
    System.out.println(weakSet.size()); // prints "0"

這里通常會發生什么:我們將新對象添加到集合中( weakSet.add(new Object()) )。 但是由於我們沒有保留任何引用,GC會發現此對象將從集合中刪除。

需要在GC上循環,因為不能保證在這種簡單示例情況下進行垃圾收集。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM