Java 双向关系的垃圾收集

Java 双向关系的垃圾收集,java,garbage-collection,Java,Garbage Collection,我有这样的想法: 用户: public User { List<Task> tasks = new HashSet<>(); // getter/setter } 我创建一个新的任务,并将其存储到用户: var user = new User(); var task1 = new Task(); var task2 = new Task() task1.setUser(user); task2.setUser(user); user.getTasks

我有这样的想法:

用户:

public User {

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

}
我创建一个新的
任务
,并将其存储到
用户

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.getTasks().clear();
现在问题是:

如果我从
用户
中删除
任务
-列表:

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.getTasks().clear();
任务
是否会被垃圾收集,或者是否还需要从所有
任务
中明确删除用户实例(以便成功地进行垃圾收集)


公平地说,你不需要做任何这些,
gc
wise。垃圾收集器遍历活动实例的方式已经知道哪些实例是活动的,即使您将它们“链”成递归。
openjdk
中没有基于
引用计数算法的垃圾收集器(据我所知,这可能是个问题)。虽然您可以同时调用
clear
set(null)
,但这并不重要。无法访问的实例仍将被收集。

公平地说,您不需要执行这些操作,
gc
wise。垃圾收集器遍历活动实例的方式已经知道哪些实例是活动的,即使您将它们“链”成递归。
openjdk
中没有基于
引用计数算法的垃圾收集器(据我所知,这可能是个问题)。虽然您可以同时调用
clear
set(null)
,但这并不重要。无法访问的实例仍将被收集。

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

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