应用程序启动5小时后完全GC,占用时间为40秒

时间:2014-07-28 10:59:06

标签: java performance garbage-collection jvm

我们一次处理500万个请求。但是,在运行期间,很少有请求失败。在验证结束后,我们了解到全GC已被踢入并且持续时间超过40秒(至60秒),从而导致超时。

配置: 我们有3个tomcat实例和Apache服务器。 UseParallelGc与20个并行GC线程一起使用。

以下是GC日志的摘录

[GC 9159407K->4631063K(9193536K), 0.1151870 secs]
[Full GC 4631063K->4474675K(9194112K), 40.2139890 secs]
[GC 9005619K->4545178K(9169472K), 0.0426840 secs]
[GC 9051866K->4587006K(9175232K), 0.1107250 secs]
[GC 9093694K->4603255K(9181440K), 0.1011030 secs]
[GC 9106359K->4627576K(9179776K), 0.1338130 secs]
[GC 9130680K->4631971K(9182144K), 0.1962060 secs]
[Full GC 4631971K->234907K(9181568K), 0.7454950 secs]
[GC 4739803K->278254K(9180288K), 0.0559540 secs]
[GC 4783150K->298456K(9181760K), 0.1616380 secs]
[GC 4804632K->300414K(9181376K), 0.0902670 secs]
[GC 4806590K->327319K(9180672K), 0.1219910 secs]
[GC 4832855K->319675K(9149376K), 0.0465920 secs]
[GC 4825211K->339411K(9182720K), 0.1143500 secs]
[GC 4845907K->340064K(9180736K), 0.0491540 secs]

我的问题是:

  1. 完成GC仅在应用程序启动后5小时启动。有没有办法在不改变年轻人和老年人的记忆大小的情况下尽快调整它甚至[编辑]?

  2. 第一次完整的GC运行发生(16:43:25),持续40秒,但仅释放0.15 GB左右。但是,另一个完整的GC在一分钟内发生(在16:44:12)并且它释放超过4 GB。差距只是一分钟。可能是什么原因?

  3. 如果需要任何其他信息,请告诉我。

1 个答案:

答案 0 :(得分:2)

-XX:+ UseParallelGC仅为Young生成使用并行收集器。如果您只启用了UseParallelGC,那么您使用的线程数无关紧要,只有1个线程,您的旧代集合总是以串行模式发生。

查看您的日志,我只看到GC的摘要,通常是-XX + PrintGC的输出,它不会给出很多关于这个问题的线索。我建议你试试

-XX:+PrintGCDetails
-XX:+PrintTenuringDistribution
-XX:-PrintGCTimeStamps

(或)-Xloggc,其中包含存储ur gc输出的位置。

使用上述标志,您可以找到更多详细信息,例如GC之前和之后的内存,而不是单行

在您的日志中,Full GC可能是您的旧一代中发生的主要GC,只有UseParallelGC标志,它总是使用单个线程完成。

经过一些正确的分析后,您可以使用-XX:+ UseParallelOldGC,它将并行执行旧代集合,如果您使用的是最新的JDK7,则可以使用CMS或G1 GC