我有以下代码片段:
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
作为该类中的字段包含在内。