2015-10-05 344 views
1

我正在使用tomcat7和JRE 1.8运行Java WebApp。应用程序缓存大量数据(〜15GB),并支持高吞吐量(〜4K /秒)。由于请求率高,它在年轻一代中产生了大量的对象,一些对象在年轻一代中幸免于ParNew系列,并被转移到幸存者身上,最终转移到堆内存中的老一代空间。Java 8:即使CMSInitiatingOccupancyFraction指定了CMS,也不会对老一代开始

这些对象不断累积在老一代。当老一代几乎已经满了时,CMS开始实施,并导致停止世界GC。这会影响我的应用程序的延迟。

为了避免这种情况,我开始使用CMSInitiatingOccupancyFraction = 85以及+ UseCMSInitiatingOccupancyOnly。然而,尽管有这两种选择,但当老一代85%已满时,CMS不起作用。当老一代几乎已经满员并且停止了世界的GC时,它仍然会发生。我搜索了CMSInitiatingOccupancyFraction的局限性,但找不到解释行为的任何相关链接。请找到确切的命令行下面我Tomcat进程:

jsvc.exec -home /usr/lib/jvm/jre1.8.0_45 -user tomcat7 -pidfile /home/ameya/service/2.0.4-SNAPSHOT/logs/catalina-daemon.pid -outfile /home/ameya/service/2.0.4-SNAPSHOT/logs/catalina-daemon.out -errfile &1 -classpath /home/ameya/conf/service:/home/ameya/service/2.0.4-SNAPSHOT/bin/bootstrap.jar:/home/ameya/service/2.0.4-SNAPSHOT/bin/commons-daemon.jar:/home/ameya/service/2.0.4-SNAPSHOT/bin/tomcat-juli.jar -Djava.util.logging.config.file=/home/ameya/service/2.0.4-SNAPSHOT/conf/logging.properties -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:+ExplicitGCInvokesConcurrent -Djava.awt.headless=true -XX:PermSize=1G -XX:MaxPermSize=5G -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=85 -Xms12G -Xmx24G -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9004 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Duser.language=en -Duser.country=US -Dsun.net.inetaddr.ttl=30 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/dump.tmp -XX:+AggressiveOpts -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs= -Dcatalina.base=/home/ameya/service/2.0.4-SNAPSHOT -Dcatalina.home=/home/ameya/service/2.0.4-SNAPSHOT -Djava.io.tmpdir=/home/ameya/service/2.0.4-SNAPSHOT/temp org.apache.catalina.startup.Bootstrap 

是否有人可以帮助我了解为什么CMS不启动的时候,老一代为85%满运行?

+0

您应该提供GC日志。如果有必要,将它们寄存在外部网站 – the8472

回答

0

根据oracle forums增量式CMS忽略InitiatingOccupancyFraction。

ICMS也就是在OpenJDK的9 deprecatedwill be removed而且不会使一台服务器的机器,因为它主要是用于那些具有一个或两个核心的处理器上运行的应用程序上太大的意义。

+0

感谢您的指点。但是,它表示iCMS更早开始收集,并将其展开。但我没有看到这种行为。我的应用程序的对象分配率相当稳定,没有尖峰。所以我不认为后面的说明(关于愚弄iCMS的应用)适用。无论如何,尝试删除增量模式。 – Ameya

+0

删除“-XX:+ CMSIncrementalMode -XX:+ CMSIncrementalPacing”之后,CMS现在正在进入85%已满的旧一代。非常感谢投入。 – Ameya

相关问题