我正在运行一个生成巨大树的算法,最少可运行结果出现了2,069,073个节点,并占用了3 GB内存。
但那不行!
我的问题是,运行时是否有任何好的方法或做法可以动态回收任何不需要的节点?
编辑:“我正在运行多处理器调度算法,每台机器上有2台机器和10个作业。”
答案 0 :(得分:3)
请更准确地说明您的需求。
什么方法可以“回收”?只要所有这些节点都很强大 他们当然会联系并且没有资格进行垃圾收集 不被GC。
如果树的任何部分是“一次性的”,即不再需要,你 应该删除这些连接和/或可以使用现有的对象 链接到树的其他部分并填充新数据。
答案 1 :(得分:3)
维护自己的节点池......如果这就是你的意思......根本不会有任何帮助。如果节点变得可访问,则垃圾收集器将找到它们。实施不当的对象池可以停止这种情况发生,从而使问题变得更糟。
我怀疑你的问题是你正在泄漏物体。如果树中存在不再需要的节点,则应该能够通过将null分配给父节点的相关字段或数组元素来消除它们。假设您的节点图实际上是一棵树,这应该足以断开节点和子节点与主树的连接,并且(如果它现在无法访问)使其有资格进行垃圾收集。
另一种可能性是代码中某处存在另一种内存泄漏。
答案 2 :(得分:2)
只要对给定节点没有更多可访问的引用,就可以对其进行垃圾回收。在极少数情况下,像System.gc()
手动触发垃圾收集是有意义的,但通常这不是必要的,因为GC无论如何都会定期发生。
您认为不需要的节点是什么?如果您永远不会访问/需要它们,只需从树中删除,然后让GC回收内存......
您在每个节点中存储了哪种数据? 3Gb似乎对我来说很多......
答案 3 :(得分:1)
java是垃圾收集语言,所以这可能没有必要。 This website对垃圾收集有非常有用的解释。根据该文章,将不需要的变量设置为null
将允许它们被垃圾收集。
出于好奇,你在做什么产生了200万个节点?