我有一个大型程序,其中包含一个具有数千次迭代的主类。该代码在每次迭代中调用四个方法,并将每个方法的结果保存在ArrayLists中,最后报告结果中的最佳解决方案。
我想将我的主类置于for循环中,并运行我的代码20次。首先,我遇到堆空间错误。我用垃圾收集器解决了这样的错误:在主类的末尾,(在使不必要的ArrayLists = null之后)我放入了“ System.gc”。
再次运行5之后,我遇到了堆空间错误,但是这次要解决此问题,我在每个方法中都放入了“ System.gc”,但是我的代码运行了几个小时却没有终止应在5或6分钟内完成的时间!如何解决该问题?
答案 0 :(得分:3)
在收集所有可能的垃圾之前,Java不会抛出OutOfMemoryError
。因此,在这种情况下手动调用垃圾收集器将无济于事。
在每种方法中散布System.gc();
调用的主要作用是使一切变得非常慢。即使没有发现新的垃圾,完整的垃圾收集周期自然也是一项大操作。
相反,increase the amount of memory you allocate to the JVM。和/或,重新设计程序以一次在内存中保存较少的数据。
答案 1 :(得分:1)
您无法真正控制垃圾收集,使用“ System.gc”可以标记收集器的代码,说“嘿,我有需要删除的东西”,但是是否运行GC不在您的范围之内手。还请注意,GC仅会永久删除其上没有引用的对象。