内存不足,是否有动态回收树中不需要的节点的方法?

时间:2011-06-17 14:34:23

标签: java memory-management

我正在运行一个生成巨大树的算法,最少可运行结果出现了2,069,073个节点,并占用了3 GB内存。

但那不行!

我的问题是,运行时是否有任何好的方法或做法可以动态回收任何不需要的节点?

编辑:“我正在运行多处理器调度算法,每台机器上有2台机器和10个作业。”

4 个答案:

答案 0 :(得分:3)

请更准确地说明您的需求。

什么方法可以“回收”?只要所有这些节点都很强大 他们当然会联系并且没有资格进行垃圾收集 不被GC。

如果树的任何部分是“一次性的”,即不再需要,你 应该删除这些连接和/或可以使用现有的对象 链接到树的其他部分并填充新数据。

答案 1 :(得分:3)

维护自己的节点池......如果这就是你的意思......根本不会有任何帮助。如果节点变得可访问,则垃圾收集器将找到它们。实施不当的对象池可以停止这种情况发生,从而使问题变得更糟。

我怀疑你的问题是你正在泄漏物体。如果树中存在不再需要的节点,则应该能够通过将null分配给父节点的相关字段或数组元素来消除它们。假设您的节点图实际上是一棵树,这应该足以断开节点和子节点与主树的连接,并且(如果它现在无法访问)使其有资格进行垃圾收集。

另一种可能性是代码中某处存在另一种内存泄漏。

答案 2 :(得分:2)

只要对给定节点没有更多可访问的引用,就可以对其进行垃圾回收。在极少数情况下,像System.gc()手动触发垃圾收集是有意义的,但通常这不是必要的,因为GC无论如何都会定期发生。

您认为不需要的节点是什么?如果您永远不会访问/需要它们,只需从树中删除,然后让GC回收内存......

您在每个节点中存储了哪种数据? 3Gb似乎对我来说很多......

答案 3 :(得分:1)

java是垃圾收集语言,所以这可能没有必要。 This website对垃圾收集有非常有用的解释。根据该文章,将不需要的变量设置为null将允许它们被垃圾收集。

出于好奇,你在做什么产生了200万个节点?