这与我的问题Java Excel POI stops after multiple execution by quartz有关.
我的程序在几次迭代后意外停止。我尝试进行分析,发现每次迭代都会消耗大量堆内存(并且某处存在内存泄漏......还没有找到问题所在)。因此,作为临时解决方案,我尝试在程序的每次完整执行结束时插入 System.gc();
(请阅读链接的问题以获取程序的简要说明)。我并没有期待太多,也许每次迭代后都会有更多可用的堆空间。但是,当我插入 System.gc(); 时,程序使用的堆内存似乎较少。
上图显示了使用 System.gc();
运行的程序,而下图是没有使用的程序。正如您所看到的,上图显示在程序 4 次迭代后我只使用了不到 100mb,而下图显示在相同数量的迭代中使用了超过 100mb。谁能澄清 System.gc();
如何以及为何在我的堆中造成这种影响?如果我在程序中使用它会有什么缺点吗?或者我对编程完全无望而转而从事摄影?
请注意,我在每次程序迭代的末尾插入了 GC。所以我假设堆使用情况必须与没有插入GC时相同,直到满足System.gc();
命令
谢谢!
最佳答案
Can anyone clarify how and why System.gc(); causes this effect in my heap?
System.gc
是一种垃圾收集器运行的请求服务。请注意,我在语句中使用了 request
而不是 trigger
。基于堆状态的GC可能/不进行收集。
If there are any disadvantages if I were to use this in my program?
根据经验,GC 在单独放置时效果最佳。在您的示例中,您不必担心或使用 System.gc
。因为 GC 会在最适合运行的时候运行,手动请求它可能会降低性能。尽管差异很小,但您可以观察到下图中的“GC 花费的时间”比第一个图表更好。
根据内存,这两个图都没有问题。看起来你的最大堆有点高。因此 GC 没有在第二张图中运行它。如果确实需要的话,它就会运行它。
关于java - 调用垃圾回收会导致程序在java中使用较少的堆内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14118277/