java - 调用垃圾回收会导致程序在java中使用较少的堆内存

标签 java garbage-collection profiling

这与我的问题Java Excel POI stops after multiple execution by quartz有关.

我的程序在几次迭代后意外停止。我尝试进行分析,发现每次迭代都会消耗大量堆内存(并且某处存在内存泄漏......还没有找到问题所在)。因此,作为临时解决方案,我尝试在程序的每次完整执行结束时插入 System.gc(); (请阅读链接的问题以获取程序的简要说明)。我并没有期待太多,也许每次迭代后都会有更多可用的堆空间。但是,当我插入 System.gc(); 时,程序使用的堆内存似乎较少。

enter image description here

上图显示了使用 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/

相关文章:

.net - 我如何使用 !gcroot

java - 在 JTextField 中插入值后,不会显示它们的随机值。我该如何解决?

java - 我应该在我的 java 持久性项目中调用 System.gc() 吗?

java - 更新后无法登录tomcat管理器

安卓游戏开发与垃圾回收

java - java中可以有多个堆吗?

iis-7 - IIS7 分析

c++ - 在 C++ 代码中使用嵌入式汇编语言进行错误分析

Java:是否可以使用final设置未初始化类的值?

java - Integer.parseInt 删除前导 0