JVMクイックチューニングマニュアルの5:ParNewコレクタ+CMSコレクタの製品ケーススタディ(応答時間優先)

5283 ワード

一.サーバ:


-デュアルコア、4つのcores;16G memory
[root@alish2-cassandra-01 ~]# cat /proc/cpuinfo | grep "cpu cores"

cpu cores       : 2
cpu cores       : 2

二.式の簡単な説明:


応答時間優先のコンカレントコレクタは,主にシステムの応答時間を保証し,ごみ収集時の停止時間を低減する.アプリケーションサーバ、電気通信分野などに適しています.
1.ParNewコレクタ:ParNewコレクタはSerialコレクタのマルチスレッドバージョンであり、サーバモードで実行される仮想マシンで優先される新世代コレクタの多くは、Serialを除いてCMSコレクタと連携できるだけです.
2.CMSコレクター:CMS、全称Concurrent Low Pause Collector、jdk 1.4後期バージョンから導入された新しいgcアルゴリズムはjdk 5とjdk 6でさらに改良された.
その主な適合シーンは応答時間の重要性に対する需要がスループットに対する要求より大きく、ゴミ回収スレッドと応用スレッドがプロセッサ資源を共有することに耐えられる.
また,アプリケーションには比較的多くの長寿命周期のオブジェクトのアプリケーションが存在する.CMSはtenured generationの回収、すなわち年老いた世代の回収に用いられ、アプリケーションの一時停止時間をできるだけ減らし、FullGCの発生確率を減らし、アプリケーションスレッドと並行するゴミ回収スレッドを利用して年老いた世代の除去をマークすることを目標としている.
CMSは一時停止していないのではなく、シリアルタグ整理アルゴリズムの長い一時停止の代わりに2回の短い停止を使用し、その収集サイクルはこのようになっている.
 (CMS-initial-mark) ->  (CMS-concurrent-mark)->
   (CMS-remark) ->  (CMS-concurrent-sweep) ->
  CMS (CMS-concurrent-reset)。

そのうちの1,3の2つのステップは、すべてのアプリケーションスレッドを一時停止する必要があります.rootオブジェクトから生存をマークするオブジェクトを最初に一時停止し、この段階を初期マークと呼ぶ.2回目の一時停止は、同時タグの後、すべてのアプリケーション・スレッドを一時停止し、同時タグ・フェーズの欠落したオブジェクトを再タグします(同時タグ・フェーズの終了後にオブジェクトのステータスが更新されます).1回目の一時停止は短く、2回目の一時停止は通常長く、remarkのこの段階は並列にマークすることができます.
同時タグ、同時パージ、同時リセット段階のいわゆる同時実行とは、1つ以上のゴミ回収スレッドとアプリケーションスレッドが同時実行され、ゴミ回収スレッドはアプリケーションの実行を一時停止しません.1つ以上のプロセッサがある場合、同時収集スレッドはアプリケーションスレッドとは異なるプロセッサ上で実行されます.このようなオーバーヘッドはアプリケーションのスループットを低下させることは明らかです.Remarkフェーズのパラレルとは、すべてのアプリケーションを一時停止した後、一定数のゴミ回収プロセスを起動してパラレルタグを行い、このときのアプリケーションスレッドは一時停止します.

三.数式:


($TOMCAT_HOME/bin/catalina.sh)
export JAVA_OPTS="-server -Xmx10240m -Xms10240m -Xmn3840m -XX:PermSize=256m
-XX:MaxPermSize=256m -Denv=denalicnprod
-XX:SurvivorRatio=8  -XX:PretenureSizeThreshold=1048576
-XX:+DisableExplicitGC  
-XX:+UseParNewGC  -XX:ParallelGCThreads=10
-XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled
-XX:+CMSScavengeBeforeRemark -XX:ParallelCMSThreads=10
-XX:CMSInitiatingOccupancyFraction=70
-XX:+UseCMSInitiatingOccupancyOnly
-XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0
-XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled
-XX:+UseFastAccessorMethods
-XX:LargePageSizeInBytes=128M
-XX:SoftRefLRUPolicyMSPerMB=0
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC
-XX:+PrintGCApplicationStoppedTime -XX:+PrintGCDateStamps -Xloggc:gc.log -verbose:gc"

四.数式の解析:


server
必ず第1のパラメータとして、JDKのserverバージョンを有効にして、複数のCPUの時性能は良いです
-Xms
JAva Heap初期サイズ.デフォルトは物理メモリの1/64です.この値は-Xmxと同じに設定でき、ゴミ回収が完了するたびにJVMにメモリが再割り当てされないようにします.
-Xmx
JAva heap最大値.いずれも物理メモリの80%に設定することを推奨します.物理メモリを超えてはいけません.
-Xmn
若い世代のサイズを設定し、一般的にXmxの2/8~3/8に設定し、-XX:NewSizeと-XX:MaxNewSizeに等しい.
-XX:PermSize
メモリの永続保存領域の初期サイズを設定します.デフォルト値は64 Mです.
-XX:MaxPermSize
メモリの永続保存領域の最大サイズを設定します.デフォルト値は64 Mです.
-Denv
tomcatが実行するプロジェクトを指定します
-XX:SurvivorRatio
Eden領域とSurvivor領域の大きさの比を8に設定すると、2つのSurvivor領域と1つのEden領域の比は2:8で、1つのSurvivor領域は若い世代全体の1/10を占めている.
-XX:PretenureSizeThreshold
年老いた世代の対象の大きさを昇進させる.デフォルトは0です.たとえば1048576(1 M)に設定すると、1 Mを超えるオブジェクトはeden領域に割り当てられず、直接年老いた世代に入ります.
-XX:+DisableExplicitGC
システムを閉じるgc()
-XX:+UseParNewGC
若い世代を同時収集に設定します.CMSコレクションと併用できます.
-XX:ParallelGCThreads
-XX:+UseConcMarkSweepGC
高齢者を同時収集に設定します.テスト中にこれを設定した後、-XX:NewRatio=4の設定が無効になりました.したがって、このときの若い世代の大きさは-Xmnで設定することが望ましい.
-XX:+CMSParallelRemarkEnabled
パラレルremarkを開く
-XX:+CMSScavengeBeforeRemark
このパラメータは、CMS remarkを実行する前にyoungGCを行うことを意味し、remarkの時間を効果的に低減することができます.
-XX:ParallelCMSThreads
CMSのデフォルトで起動する回収スレッド数は(ParallelGCThreads+3)/4)であり、明確に設定する必要がある場合は-X:ParallelCMSThreads=20で設定できます.ここでParallelGCThreadsは若い世代の並列収集スレッド数です
-XX:CMSInitiatingOccupancyFraction
cmsをゴミ回収として70%使用してCMS収集を開始
-XX:+UseCMSInitiatingOccupancyOnly
手動定義初期化定義を使用してCMS収集を開始
-XX:+UseCMSCompactAtFullCollection
年老いた世代への圧縮を開く.パフォーマンスに影響を与える可能性がありますが、メモリの破片を除去できます.
-XX:CMSFullGCsBeforeCompaction
コンカレントコレクタはメモリスペースを圧縮、整理しないため、しばらく実行すると「フラグメント」が発生し、実行効率が低下します.このパラメータは、実行回数FullGCを設定した後、メモリ領域を圧縮、整理します.
-XX:+CMSPermGenSweepingEnabled
Permゾーンが満たされることによるfull gcを避けるために、CMS回収Permゾーンオプションをオンにすることをお勧めします
-XX:+CMSClassUnloadingEnabled
Permゾーンが満たされることによるfull gcを避けるために、CMS回収Permゾーンオプションをオンにすることをお勧めします
-XX:+UseFastAccessorMethods
元のタイプの高速最適化
-XX:LargePageSizeInBytes
メモリページのサイズ、大きすぎてはいけません.Permのサイズに影響します.
-XX:SoftRefLRUPolicyMSPerMB
ソフトリファレンス(Soft Reference)のオブジェクトは、最後にアクセスした後、0ミリ秒(デフォルトは1秒)生存します.
-XX:+PrintGCDetails
GC実行時の詳細データを記録し、新たに生成されたオブジェクトの消費メモリサイズや時間などを含む
-XX:+PrintGCTimeStamps
ごみ収集のタイムスタンプの印刷
-XX:+PrintHeapAtGC
GC前後の詳細スタック情報の印刷
-XX:+PrintGCApplicationStoppedTime
ごみ回収期間のプログラムが一時停止する時間を印刷する.上と混合して使用可能
-XX:+PrintGCDateStamps
前にgcログを印刷するときに使用するのは:-XX:+PrintGctimeStampsで、このオプションはjvm起動時間を起点とする相対時間を記録して、可読性が悪くて、位置決めの問題に不利で、PrintGCDateStampsを使って記録するのはシステム時間で、更にhumanreadable
-Xloggc
上のいくつかと組み合わせて使用し、関連ログ情報をファイルに記録して分析します.
-verbose:gc
GCの稼働および稼働時間を記録し、一般的にGCが適用のボトルネックであるかどうかを確認するために使用されます.
「ITPUBブログ」からのリンク:http://blog.itpub.net/30089851/viewspace-2121380/