我有这个类,我正在测试具有不同数据分布的插入.我在我的代码中这样做:
...
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树(),垃圾收集器就没有摆脱旧树.但为什么?我以为老树的元素将无法再被访问,他们的记忆将会被清理干净.
垃圾收集器应该没有清理你的旧树对象的麻烦,所以我只能假设你正在做的其他一些分配没有被清理.
Java有一个很好的工具来监视正在进行的GC(或者不是你的情况),它是JDK附带的JVisualVM.
只需运行它,它将显示哪些对象占用了堆,您可以触发并查看GC的进度.然后,您可以针对池进行定位,以便您可以重复使用它们,从而节省GC的工作量.
另外看一下这个选项,它可能会阻止你得到的错误停止程序,你的程序将完成,但可能需要很长时间,因为你的应用程序将填满堆然后运行非常慢.
-XX:-UseGCOverheadLimit
| 归档时间: |
|
| 查看次数: |
1905 次 |
| 最近记录: |