关于java垃圾收集的问题

2 java garbage-collection

我有这个类,我正在测试具有不同数据分布的插入.我在我的代码中这样做:

...

AVLTree tree = new AVLTree();

//insert the data from the first distribution

//get results

...

tree = new AVLTree();

//inser the data from the next distribution

//get results

...
Run Code Online (Sandbox Code Playgroud)

我正在为3个发行版做这个.每个应平均测试14次,并从中删除2个最低/最高值以计算平均值.这应该做2000次,每次1000个元素.换句话说,它是1000,2000,3000,...,2000000.

问题是,我只能达到100000.当我尝试200000时,我用尽了堆空间.我在命令行中使用-Xmx将可用堆空间增加到1024m,它甚至没有用200000完成测试.我尝试了2048m再次,它不起作用.

我在想的是,一旦我做了树=新AVL树(),垃圾收集器就没有摆脱旧树.但为什么?我以为老树的元素将无法再被访问,他们的记忆将会被清理干净.

pax*_*blo 5

垃圾收集器应该没有清理你的旧树对象的麻烦,所以我只能假设你正在做的其他一些分配没有被清理.

  • Java GC可以处理它,您不需要清理节点. (5认同)
  • @Rick,这不应该导致堆外错误,只是一个"停止世界"GC来清理剩余的节点.应用程序中还有其他东西正在使对象*不能用于GC(IMO,因为信息有限). (3认同)
  • 绝对不要为所有节点分配null.Java垃圾收集器工作得非常好.明确地使引用无效也无济于事. (2认同)

jus*_*nhj 5

Java有一个很好的工具来监视正在进行的GC(或者不是你的情况),它是JDK附带的JVisualVM.

只需运行它,它将显示哪些对象占用了堆,您可以触发并查看GC的进度.然后,您可以针对池进行定位,以便您可以重复使用它们,从而节省GC的工作量.

另外看一下这个选项,它可能会阻止你得到的错误停止程序,你的程序将完成,但可能需要很长时间,因为你的应用程序将填满堆然后运行非常慢.

-XX:-UseGCOverheadLimit