我有以下代码片段:

public class Example {

private Integer threshold;

private Map<String, Progress> history;

protected void activate(ComponentContext ctx) {
    this.history = Collections.synchronizedMap(new LinkedHashMap<String, Progress>() {
        @Override
        protected boolean removeEldestEntry(Map.Entry<String, Progress> entry) {
            return size() > threshold;
        }
    });
  }
}

匿名LinkedHashMap类和Example类之间存在循环依赖关系。这样可以吗?为什么不?它会被垃圾收集器很好地回收吗?

最佳答案



这是完全可以的。
threshold是一个字段,因此可以从匿名类中毫无问题地对其进行引用。 (如果threshold是一个局部变量,则它必须是(有效)最终值。)

类之间的循环依赖关系很常见,并且当依赖关系图较小时(在这种情况下),它不会造成任何问题。您的LinkedHashMap是匿名类的事实在这里并不重要。



关于内存泄漏+内部类,唯一需要警惕的是(非静态)内部类对其所在的对象有隐式引用。这意味着,如果创建大量内部类实例,就不能期望外部类对象的实例被垃圾回收。

在这种情况下,这意味着如果您泄漏对history映射的引用,则不会对Example实例进行GC处理。

相关说明:

  • 考虑到您正在使用synchronizedMap,似乎您正在使用多线程程序。在这种情况下,您需要警惕threshold字段的同步和可见性问题。
  • 如果可能,请尝试使threshold字段最终成为
  • 另一个选择是为LinkedHashMap创建一个命名类,并将threshold作为该类中的字段包含在内。
  • 10-08 19:56