有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java:具有弱引用的堆栈

在Java中,有一种称为WeakHashMap的数据结构,它将弱引用存储为键。无论何时从内存中取出弱引用,都会从映射中删除条目

如果我有一个存储弱引用的数据结构(如堆栈或集合),当弱引用从内存中取出时,它们的条目是否会自动删除

下面是存储弱引用的堆栈示例

Stack<WeakReference<Object>> objStack = new Stack<WeakReference<Object>>();

共 (2) 个答案

  1. # 1 楼答案

    迟做总比不做好

    这不是弱引用的工作方式。WeakReference-对象将始终存在,但其get()-方法可能返回原始对象或null(如果原始对象是GC:ed)

    这意味着您的堆栈将始终包含WeakReference-对象

    这是一个冗长的测试,但是它取决于在中间做GC的JVM,它可能发生或可能不会发生在命令上。如果不发生,尝试添加更多的^ {CD5>}:S:

    public static void main(String[] args) {
        // Set up
        Object object = new Object();
        final WeakReference<Object> weakReference = new WeakReference<>(object);
        final Stack<WeakReference<Object>> references = new Stack<>();      
        references.add(weakReference);
    
        // Before
        System.out.println("Before:");
    
        references.forEach(r -> {
            System.out.println("Reference: " + r);
            System.out.println("Object: " + r.get());
        });
    
        // GC
        object = null;
    
        System.gc();
        System.gc();
        System.gc();
    
        // After
        System.out.println("After:");
        references.forEach(r -> {
            System.out.println("Reference: " + r);
            System.out.println("Object: " + r.get());
        });
    }
    

    输出:

    Before:
    Reference: java.lang.ref.WeakReference@238e0d81
    Object: java.lang.Object@31221be2
    After:
    Reference: java.lang.ref.WeakReference@238e0d81
    Object: null
    

    最好的方法可能是忽略get()一旦“弹出”就返回null的条目

    旁注:我的第一个测试是使用一个字符串对象,它从未得到GC:ed。这是因为Java中的字符串是“interned”(参见String.intern()),这意味着存在一个可重用的静态字符串的隐藏缓存。字符串永远不会被GC:ed,除非字符串池已满(或沿着该行的某个东西…)我认为字符串是唯一具有这种“特殊”特性的Java对象,但我建议在WeakReference中始终使用定制对象,以确保它正确地得到GC:ed

  2. # 2 楼答案

    对。你所描述的是弱引用的一般属性,而不是WeakHashMap特定属性

    the API

    Suppose that the garbage collector determines at a certain point in time that an object is weakly reachable. At that time it will atomically clear all weak references to that object...