Tomcat7 と JRE 1.8 を使用して Java WebApp を実行しています。アプリケーションは大量のデータ (~15GB) をキャッシュし、高いスループット (~4K/秒) をサポートします。要求率が高いため、若い世代に多数のオブジェクトが生成されます。一部のオブジェクトは、若い世代の ParNew コレクションを生き残り、サバイバーに移動され、最終的にはヒープ メモリ内の古い世代の空間に移動されます。
これらのオブジェクトは古い世代に蓄積され続けます。旧世代がほぼ満杯になると CMS が起動し、その結果、stop-the-world GC が発生します。これは、アプリケーションのレイテンシーに影響します。
これを避けるために、 とCMSInitiatingOccupancyFraction=85
一緒に使い始めました+UseCMSInitiatingOccupancyOnly
。ただし、これら 2 つのオプションがあるにもかかわらず、古い世代が 85% いっぱいになると、CMS は起動しません。古い世代がほぼいっぱいになり、stop-the-world 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 が実行を開始しない理由を誰かが理解するのを手伝ってくれませんか?