gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:28:15 24 4
gpt4 key购买 nike

这与我的问题有关 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com