为什么Java要等待这么长时间才能运行垃圾回收器?
我正在构建一个Java Web应用程序,使用Play!框架。我在 playapps.net 上托管它。我一直对提供的内存消耗图表感到困惑了一段时间。下面是一个示例:
该图表来自一段一致但名义上的活动时期。我没有做任何事情来触发内存中的衰减,所以我推测这是因为垃圾回收器在几乎达到允许的内存消耗时运行。
我的问题:
- 对于我来说,假设我的应用程序没有内存泄漏,因为垃圾回收器在运行时似乎正确回收了所有内存,这是否公平?
- (从标题)为什么java要等到最后一秒才能运行垃圾回收器?我看到性能显着下降,因为内存消耗增长到图表的前四分之一。
- 如果我上面的断言是正确的,那么我该如何解决这个问题?我读过的关于SO的其他帖子似乎反对调用,从中立(“这只是运行GC的请求,所以JVM可能会忽略你”)到完全反对(“依赖的代码从根本上被破坏了”)。还是我在这里偏离了基础,我应该在我自己的代码中寻找导致这种行为和间歇性性能损失的缺陷?
System.gc()
System.gc()
更新
我已经开启了关于 PlayApps.net 的讨论,指出这个问题并在这里提到一些要点;具体@Affe关于完整 GC 设置的非常保守的注释,以及@G_H关于初始和最大堆大小设置的注释。
这是讨论的链接,尽管很遗憾你需要一个playapps帐户才能查看它。
当我得到反馈时,我会在这里报告反馈;非常感谢大家的回答,我已经从他们身上学到了很多东西!
分辨率
Playapps支持,仍然很棒,对我没有太多建议,他们唯一的想法是,如果我广泛使用缓存,这可能会使对象存活的时间超过需要的时间,但事实并非如此。我仍然学到了很多东西(哇噢!),我给了@Ryan阿莫斯绿色支票,因为我接受了他每半天打电话的建议,现在工作正常。System.gc()