为什么java等待这么长时间来运行垃圾收集器? [英] Why does java wait so long to run the garbage collector?

查看:119
本文介绍了为什么java等待这么长时间来运行垃圾收集器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在构建一个Java Web应用程序,使用。



当我得到它时,我会在这里报告反馈;非常感谢大家的回答,我已经从中学到了很多东西!



分辨率

Playapps支持,这仍然是伟大的,没有很多建议给我,他们唯一的想法是,如果我广泛使用缓存这可能是保持对象活着超过需要,但事实并非如此。我还是学到了很多东西(呜呜!),我给@Ryan Amos做了绿色检查,因为我提出了每半天打电话给 System.gc()的建议。现在工作正常。

解决方案

Java不会运行垃圾清理器,因为垃圾清理器减少了很多东西并且不应该不经常跑。我认为你可以更频繁地安排清洁,例如每3个小时。如果一个应用程序永远不会占用全部内存,那么就没有理由运行垃圾清理器,这就是为什么Java只在内存非常高时运行它。



所以基本上,不要担心别人说的话:做最好的事情。如果您发现在66%内存下运行垃圾清理器可以提高性能,那就去做吧。


I am building a Java web app, using the Play! Framework. I'm hosting it on playapps.net. I have been puzzling for a while over the provided graphs of memory consumption. Here is a sample:

The graph comes from a period of consistent but nominal activity. I did nothing to trigger the falloff in memory, so I presume this occurred because the garbage collector ran as it has almost reached its allowable memory consumption.

My questions:

  • Is it fair for me to assume that my application does not have a memory leak, as it appears that all the memory is correctly reclaimed by the garbage collector when it does run?
  • (from the title) Why is java waiting until the last possible second to run the garbage collector? I am seeing significant performance degradation as the memory consumption grows to the top fourth of the graph.
  • If my assertions above are correct, then how can I go about fixing this issue? The other posts I have read on SO seem opposed to calls to System.gc(), ranging from neutral ("it's only a request to run GC, so the JVM may just ignore you") to outright opposed ("code that relies on System.gc() is fundamentally broken"). Or am I off base here, and I should be looking for defects in my own code that is causing this behavior and intermittent performance loss?

UPDATE
I have opened a discussion on PlayApps.net pointing to this question and mentioning some of the points here; specifically @Affe's comment regarding the settings for a full GC being set very conservatively, and @G_H's comment about settings for the initial and max heap size.

Here's a link to the discussion, though you unfortunately need a playapps account to view it.

I will report the feedback here when I get it; thanks so much everyone for your answers, I've already learned a great deal from them!

Resolution
Playapps support, which is still great, didn't have many suggestions for me, their only thought being that if I was using the cache extensively this may be keeping objects alive longer than need be, but that isn't the case. I still learned a ton (woo hoo!), and I gave @Ryan Amos the green check as I took his suggestion of calling System.gc() every half day, which for now is working fine.

解决方案

Java won't run the garbage cleaner until it has to, because the garbage cleaner slows things down quite a bit and shouldn't be run that frequently. I think you would be OK to schedule a cleaning more frequently, such as every 3 hours. If an application never consumes full memory, there should be no reason to ever run the garbage cleaner, which is why Java only runs it when the memory is very high.

So basically, don't worry about what others say: do what works best. If you find performance improvements from running the garbage cleaner at 66% memory, do it.

这篇关于为什么java等待这么长时间来运行垃圾收集器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆