导致完整GC运行的原因是什么?

时间:2017-02-14 12:55:51

标签: java garbage-collection

我在tomcat上运行了一个web应用程序,其最大堆大小设置为8GB。

以下是我的vm args。

export CATALINA_OPTS="$CATALINA_OPTS -Xms512m -Xmx8192m -XX:+UseConcMarkSweepGC"

如果没有用户登录应用程序,则非可清理内存(在垃圾回收后驻留)非常低(大约1GB)。

在这种情况下,如果我使用jconsole观察内存增长模式,我会看到大约4GB的内存增长,然后垃圾收集器运行,内存再次下降到大约1 GB。如果没有用户登录,则此模式会继续。

如果我记录GC数据,我会发现如下所示。

2017-02-14T15:30:44.553+0530: 591.922: [GC (Allocation Failure) [PSYoungGen: 1501051K->631966K(1833472K)] 2392189K->1523112K(3030016K), 1.5100144 secs] [Times: user=1.49 sys=0.01, real=1.51 secs]
2017-02-14T15:31:20.335+0530: 627.705: [GC (Allocation Failure) [PSYoungGen: 1553054K->595007K(1842176K)] 2444200K->1570521K(3038720K), 1.3050284 secs] [Times: user=1.27 sys=0.04, real=1.31 secs]
2017-02-14T15:33:33.682+0530: 761.052: [GC (Allocation Failure) [PSYoungGen: 1516095K->556800K(1842176K)] 2491609K->1596474K(3038720K), 1.6957154 secs] [Times: user=1.67 sys=0.03, real=1.69 secs]
2017-02-14T15:33:35.378+0530: 762.748: [Full GC (Ergonomics) [PSYoungGen: 556800K->365446K(1842176K)] [ParOldGen: 1039673K->1196476K(2018304K)] 1596474K->1561923K(3860480K), [Metaspace: 70472K->70472K(1114112K)], 11.2779843 secs] [Times: user=11.13 sys=0.09, real=11.28 secs]
2017-02-14T15:34:56.232+0530: 843.602: [GC (Allocation Failure) [PSYoungGen: 1286534K->216613K(1842176K)] 2483011K->1609875K(3860480K), 1.4938761 secs] [Times: user=1.45 sys=0.05, real=1.50 secs]

可以看出,有时会执行完整GC,与次要GC(约1秒)相比,需要花费相当长的时间(11秒)。

由于所有其他线程在GC期间被挂起,如果用户在完整GC期间尝试访问webapp,则服务器不响应。

我想知道的是,是什么触发了这款Full GC?根据日志,次要gc事件是由于分配失败,而Full GC是由Ergonomics引起的。这是什么意思?

在这种情况下,有什么方法可以防止Full GC发生?剩下大量的可用堆空间,我想延迟Full GC的发生,直到由于较小的GC没有显着的内存减少。

2 个答案:

答案 0 :(得分:0)

解决您的主要问题(由于垃圾收集花费的时间过长导致服务器停顿),这可能是由于某些原因使用了错误的垃圾收集器。记录垃圾收集调整here。使用Garbage-First collector,您可以设置任何仍然可以接受的暂停(默认值为200毫秒,对于服务器来说不应该是一个大问题)。

答案 1 :(得分:0)

我会指向Parallel Collector链接。 “人体工程学”是一种使用应用程序的特定行为自动调整收集器的方法。

大多数情况下自动调整都很好。在你的情况下,似乎它结束了太长的GC。您可以通过调整收集器的参数来修复它。

引用文档:

最长垃圾收集暂停时间

  

使用命令行选项-XX:MaxGCPauseMillis =指定最大暂停时间目标。这被解释为需要暂停毫秒或更短的暂停时间的提示;默认情况下,没有最大暂停时间目标。如果指定了暂停时间目标,则会调整堆大小和与垃圾回收相关的其他参数,以尝试使垃圾收集暂停时间短于指定值。这些调整可能会导致垃圾收集器降低应用程序的总吞吐量,并且无法始终满足所需的暂停时间目标。

<强>吞吐量

  

吞吐量目标是根据垃圾收集所花费的时间与垃圾收集之外所花费的时间(称为应用程序时间)来衡量的。目标由命令行选项-XX:GCTimeRatio =指定,它将垃圾收集时间与应用程序时间的比率设置为1 /(1 +)。

     

例如,-XX:GCTimeRatio = 19设置垃圾收集总时间的1/20或5%的目标。默认值为99,导致垃圾收集时间为1%的目标。

<强>脚印

  

使用-Xmx选项指定最大堆占用空间。此外,只要满足其他目标,收集器就有一个隐含的目标,即最小化堆的大小。

相关问题