为什么Java等待这么长时间才能运行垃圾回收器?

goggin13:

我正在使用Play构建Java Web应用程序框架我将其托管在playapps.net上我一直对提供的内存消耗图感到困惑。这是一个示例:

堆内存

该图来自一个持续但名义上活跃的时期。我没有采取任何措施来触发内存下降,所以我认为发生这种情况是因为垃圾收集器因为它几乎达到了其允许的内存消耗而运行。

我的问题:

  • 它是公平的,我认为我的应用程序并不会有内存泄漏,因为它似乎是所有内存都被正确地被垃圾回收器回收它在运行时?
  • (摘自标题)为什么Java等待运行最后一秒才能运行垃圾收集器?随着内存消耗增长到图表的前四位,我看到性能显着下降。
  • 如果我的上述主张正确,那么我该如何解决此问题?我在SO上阅读的其他文章似乎都反对对的调用System.gc(),从中性(“这只是运行GC的请求,因此JVM可能会忽略您”)到完全反对(“所依赖的代码System.gc()从根本上破坏了”) 。还是我不在这里,我应该在自己的代码中寻找导致这种行为和间歇性性能损失的缺陷?

更新
我已经在PlayApps.net上打开了一个讨论,指出了这个问题,并在这里提到了一些要点。特别是@Affe关于完整GC设置的评论非常保守,而@G_H关于初始和最大堆大小的设置的评论。

这是讨论链接,尽管很遗憾,您需要一个playapps帐户才能查看它。

收到反馈后,我将在此处报告反馈。非常感谢大家的回答,我已经从他们那里学到很多东西!

分辨率
Playapps的支持仍然很棒,对我没有太多建议,他们唯一的想法是,如果我广泛使用缓存,这可能会使对象的生存期比需要的更长,但事实并非如此。我仍然学会了一吨(呜呼!),我接受了他建议System.gc()每半天一次电话的建议,给了@Ryan Amos绿色的支票,目前为止工作正常。

瑞安·阿莫斯(Ryan Amos):

Java除非必须这样做,否则Java不会运行垃圾清理程序,因为垃圾清理程序会大大降低速度,因此不应经常运行。我认为您可以安排更频繁的清洁,例如每3个小时一次。如果应用程序从不消耗全部内存,那么就没有理由运行垃圾清理程序,这就是Java仅在内存很高时才运行垃圾清理程序的原因。

因此,基本上,不必担心别人怎么说:做最有效的事情。如果发现以66%的内存运行垃圾清理器可以提高性能,请执行此操作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我的程序需要这么长时间才能运行?

为什么“查看”功能需要这么长时间才能运行?

为什么popViewControllerAnimated需要这么长时间才能运行?

如果以root用户身份运行,为什么此C ++程序要花这么长时间才能完成?

为什么sencha touch需要这么长时间才能加载?

为什么logstash需要这么长时间才能启动/加载?

为什么嵌套的for循环需要这么长时间才能计算?

为什么我的桌子要花这么长时间才能装载

为什么要花这么长时间处理异步等待

为什么查询在 BigQuery 中运行了这么长时间

Azure DevOps Server:为什么Visual Studio测试步骤需要这么长时间才能运行单元测试?

为什么Google Chrome浏览器需要这么长时间才能刷新本地文件?无论如何要改善?

为什么我的代码需要这么长时间才能运行,为什么它的运行时会发生重大变化?

为什么我的 javascript 需要很长时间才能运行?

为什么MATLAB作业需要很长时间才能运行?

为什么将鹦鹉螺中的垃圾箱倒空需要这么长时间?

为什么将雪豹中的垃圾清空需要这么长时间?

什么是Qt MaintenanceTool元数据?为什么要花这么长时间才能获取?

为什么我的dns更改需要这么长时间才能更新?

为什么Disk Utility / diskutil需要这么长时间才能将数据归零?

为什么我的代码花这么长时间才能返回结果?

为什么基于流的方法需要这么长时间才能完成?

为什么此GAS脚本需要这么长时间才能加载数据验证选项?

为什么我的SSIS包需要花费这么长时间才能执行?

为什么我的下载文件夹需要这么长时间才能加载?

如果删除的文件没有真正删除,为什么要花这么长时间才能恢复?

为什么我的简单cpp-netlib程序需要这么长时间才能编译?

如何发现为什么RSpec需要这么长时间才能启动?

为什么Django模型需要这么长时间才能载入admin?