双向关系的垃圾收集

garbage collection of bidirectional relationships

我有这样的东西:

用户:

public User {

    List<Task> tasks = new HashSet<>();
    // getter/setter

}

及其任务:

public Task{

    private User user;
    // getter/setter

}

我创建了一个新的 Task 并将其存储到 User:

var user = new User();
var task1 = new Task();
var task2 = new Task()
task1.setUser(user);
task2.setUser(user);
user.getTasks().add(task1);
user.getTasks().add(task2);

现在问题:

如果我从 user 中删除 tasks-list:

user.getTasks().clear();

tasks 是否会被垃圾收集,或者 我是否还需要从所有 tasks 中显式删除用户实例(以便成功进行垃圾收集)?

task1.setUser(null);  // needed?
task2.setUser(null);  // needed?
user.getTasks().clear(); // or is this all I need

公平地说,gc 明智的是,您不需要做其中的 任何。垃圾收集器遍历活动实例的方式已经知道什么是活动的或不活动的,即使您将它们“链接”到递归中也是如此。 openjdk 中没有垃圾收集器基于 reference counting 算法工作(据我所知,这可能是个问题)。虽然您可以同时调用 clear 调用 set(null),但这并不重要。仍然会收集无法访问的实例。

垃圾收集器应该为不再可达的对象释放内存。当您调用 clear 方法时,任务对象将不再有引用,因此它们应该有资格进行垃圾回收,即使其中的对象用户仍然可以访问。