Java 如何从树中回收节点?

Java 如何从树中回收节点?,java,memory-management,Java,Memory Management,[编辑]问题解决了,我发现了漏洞。多谢各位 我正在运行一个调度算法,其中的节点存储以下数据: int job[] = new int[Algo.NUM_MACHINES]; int remTime[] = new int[Algo.NUM_MACHINES]; int res = Algo.RESOURCE; int time = 0; int tardy = 0; //Job jobTree[] = new Job[Algo.NUM_JOBS]; ArrayList<Integer&g

[编辑]问题解决了,我发现了漏洞。多谢各位

我正在运行一个调度算法,其中的节点存储以下数据:

int job[] = new int[Algo.NUM_MACHINES];
int remTime[] = new int[Algo.NUM_MACHINES];
int res = Algo.RESOURCE;
int time = 0;
int tardy = 0;

//Job jobTree[] = new Job[Algo.NUM_JOBS];
ArrayList<Integer> jobsFinished = new ArrayList<Integer>();

int id;
boolean visited = false;
Machine parent = this;//so that root node points to himself
ArrayList<Machine> children = new ArrayList<Machine>();

int duplicate = 0;//duplicate (sj-sj-sj-sj-...) flag

是否足以导致节点被回收?您将如何编写代码来回收节点

要使对象在垃圾收集环境中可回收,必须确保不存在可访问对象对其的引用

垃圾收集通过以下引用查看哪些对象是可访问的。当您覆盖引用或将其设置为
null
时,您正在烧成一座通向目标对象的桥,如果没有其他方法到达该对象,则可以回收内存

据我所知,你不需要这句话:

node.parent=null;
因为当从ArrayList中删除节点时,
节点变得不可访问(除非在应用程序的其他地方有指向它的指针)。如果
节点
不可访问,那么它指向什么并不重要,因为它已经沉没了

如果没有收集节点,但您认为应该收集,请尝试找出指向它们的内容。它甚至可能是堆栈中保持内存固定的某个位置的参数或变量


免责声明:我不懂Java,所以我不知道它的VM是如何工作的。我将根据我对垃圾收集的一般知识来做。

假设您已经准确地描述了节点数据结构,并准确地描述了“回收”节点的“算法”,那么它应该可以工作

如果探查器告诉您,当节点不应该是可访问的时,它们仍然是可访问的,那么以下一项(或多项)必须为真:

  • 在局部变量、方法参数或与树分离的其他数据结构中,对节点有活动(强)引用

  • 你的树实际上不是树形的;i、 e.节点已在多个位置链接到树中

  • 您没有调用代码来回收节点


你怎么看?这是一个非常非常常见的关于GC如何工作的问题,您认为您的情况在某种程度上有所不同吗?我认为这应该能够从节点中删除引用,但探查器的说法不同。要么您删除了所有强引用,要么您没有。我有一个函数调用,它将节点作为参数。当方法返回时,强引用是否也会中断?@Sheldon-这取决于函数对引用所做的操作。因此,通常情况下,强引用会中断。但是如果你要(把它分配给一个字段),这个参照物应该保留下来,对吗?
node.parent=null;