双向关系的垃圾收集
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 方法时,任务对象将不再有引用,因此它们应该有资格进行垃圾回收,即使其中的对象用户仍然可以访问。
我有这样的东西:
用户:
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 方法时,任务对象将不再有引用,因此它们应该有资格进行垃圾回收,即使其中的对象用户仍然可以访问。