Java 8:CMS不适用于旧一代,即使指定了CMSInitiatingOccupancyFraction

Java 8:CMS不适用于旧一代,即使指定了CMSInitiatingOccupancyFraction,java,garbage-collection,tomcat7,concurrent-mark-sweep,Java,Garbage Collection,Tomcat7,Concurrent Mark Sweep,我正在运行一个使用tomcat7和JRE 1.8的Java WebApp。该应用程序缓存大量数据(~15GB),并支持高吞吐量(~4K/秒)。由于高请求率,它在年轻一代生成大量对象,一些对象在年轻一代的新集合中幸存下来,并移动到堆内存中的幸存空间,最终移动到旧代空间 这些物品在老一代中不断积累。CMS在老一代人几乎吃饱的时候启动,这导致停止世界GC。这会影响我的应用程序的延迟 为了避免这种情况,我开始使用CMSInitiatingOccupancyFraction=85以及+usecminiti

我正在运行一个使用tomcat7和JRE 1.8的Java WebApp。该应用程序缓存大量数据(~15GB),并支持高吞吐量(~4K/秒)。由于高请求率,它在年轻一代生成大量对象,一些对象在年轻一代的新集合中幸存下来,并移动到堆内存中的幸存空间,最终移动到旧代空间

这些物品在老一代中不断积累。CMS在老一代人几乎吃饱的时候启动,这导致停止世界GC。这会影响我的应用程序的延迟

为了避免这种情况,我开始使用
CMSInitiatingOccupancyFraction=85
以及
+usecminitingoccupancy
。然而,尽管有这两种选择,CMS在老一代85%满的情况下并不起作用。当老一代人几乎吃饱了,做了一个停止世界的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
有人能帮我理解为什么旧一代已满85%时CMS不启动运行吗?

根据增量CMS忽略InitiatingOccupancyFraction


iCMS也在openjdk 9中。而且在服务器机器上没有多大意义,因为它主要用于在具有一个或两个内核的处理器上运行的应用程序。

您应该提供GC日志。如果需要的话,将它们放在外部站点上。谢谢你的指点。然而,它说iCMS开始收集的时间要早得多,并将其传播出去。但我没有看到这种行为。我的应用程序的对象分配率相当稳定,没有峰值。因此,我认为后面的注释(关于愚弄iCMS的应用程序)不适用。无论如何都会尝试删除增量模式。在删除“-XX:+CMSIncrementalMode-XX:+CMSIncrementalPacing”后,CMS现在开始使用,旧一代的容量已满85%。非常感谢您的投入。