java My代码在调用垃圾收集器后不会终止
我有一个大型程序,由一个具有数千次迭代的主类组成。代码在每次迭代中调用四个方法,并将每个方法的结果保存在ArrayList中,最后报告结果中的最佳解决方案
我想把我的主类放在一个for循环中,并运行我的代码20次。首先,我遇到了一个堆空间错误。我使用垃圾收集器来解决这样的错误:在主类的末尾,(在使不必要的ArrayList=null之后),我放置“System.gc”
再次运行5次后,我遇到了堆空间错误,但这次为了解决这个问题,我在每个方法中都放了“System.gc”,但是我的代码运行了几个小时,没有终止,应该在5到6分钟内完成!我怎样才能解决这个问题
# 1 楼答案
Java在收集了所有可能的垃圾之后才会抛出
OutOfMemoryError
。因此,在这种情况下,手动调用垃圾收集器是没有帮助的在每个方法中使用
System.gc();
调用的主要效果是让一切都变得非常缓慢。即使没有发现新的垃圾,一个完整的垃圾收集周期自然也是一个大的操作相反,increase the amount of memory you allocate to the JVM。和/或重新设计程序,一次在内存中保存更少的数据
# 2 楼答案
你无法真正控制垃圾收集,使用“System.gc”你可以标记代码让收集器说“嘿,我有需要删除的东西”,但它是否运行gc并不在你的掌握之中。还要注意的是,只有那些没有引用的对象才会被GC永久删除