我正在使用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%满运行?
您应该提供GC日志。如果有必要,将它们寄存在外部网站 – the8472