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方法时,任务对象将不再具有引用,因此它们应该有资格进行垃圾收集,即使从内部仍然可以访问对象用户