一回のjvmメモリの調節の過程
4981 ワード
前回のメモリの最適化分析に続きます。http://dmouse.iteye.com/blog/1264118[url]、gcによるサーバーの不安定性は依然として存在しており、以下に次のような調整と分析過程を記録している。
現在オンラインには多くの「Uloading class sun.reflect.Generant Serialization ControuctoAccess or」、「promotion failed」、「concurrent mode failure」のエラー、
この三つのエラーが発生した原因については、以下の文章を参照してください。
http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html
http://blogs.oracle.com/jonthecollector/entry/when_the_sum_of_the
http://blogs.oracle.com/jonthecollector/entry/what_the_heck_ズウ.a.
以上のように、原因は大体以下の通りです。
1、tenturedの予備空間が小さすぎる
2、youngの一回の回収のメモリ空間が大きすぎて、tenturedに連続的なメモリ空間を一回に割り当てることができなくて、需要を満たすことができません。
3、tenturedの空き容量が不連続で、破片が多い
現在のオンラインシステムは、テナントの空間予約を多く採用していますが、テナントのメモリ空間圧縮を採用しています。しかし、不定期には上記の三つのerrorが多く現れます。
-XX:CMSFullGCs Before Comppaction=0
このパラメータは、fullGCを何回か指定した後、tenturedのメモリ空間圧縮を行い、0の理解は毎回行うものとし、1に設定して生産管理を行うことを推奨します。
-XX:CMSFullGCs Before Comppaction=1
現在のサーバーごとの上記3種類のerror記録数は以下の通りです。
「Uloading class」「promotion failed」「concurrent mode failure」
50----------------2233--------------------------------------------------------------------------40
51----------------2544-------------------------------------------------------------------------6
61_CPS------------------------------------------------------------------------------------------------------------31
61_CPS 2---------------------------------------------------------480
62_CPS-------------------------------------------------------487
62_CPS 2-------------------------------------------------------------------------153
メモリ回収ログを分析し、-XX:CMSFullGCs BeforeComppaction=1パラメータを調整した後、安定を回収し、追加の「Uloading class sun.reflect.Generant Serialization Contront Access or」、「promotion failed」、「concurrent mode failure」のエラーがありません。
JDK 6のHotSpot VMの中で、Oracle/Sunは公式の支持のGCがCMSだけあって比較的に特殊です:その他のいくつかのGCの周期はすべて完全なstop-the-worldです。CMSの各合併GC周期は二つのstop-the-world段階があります。initial markとfinal re-mark、その他の段階はアプリケーションと同時に実行します。
したがって、「initial-mark」と「remark」の時間を監視することにより、gcによるプログラム中断問題を反映することができます。
-Xms 3 g-Xmx 3 g-Xmn 1 g(最大メモリヒープ最小メモリ新生代最大メモリ)
1、システム環境に応じてできるだけ合理的な値を設定することを提案する。
2、最大メモリと最小メモリはできるだけ一致するように提案します。jvmはメモリを動的に割り当て、メモリの一時的な引き締めによる再割り当てオーバーヘッドを低減するため、メモリ割り当ての安定性を向上させる。Xmsと-Xmxはデフォルトでは物理メモリの1/64です。
3、できるだけ新生代メモリをシステムに合った値に設定し、小さすぎる設定を避けることを提案します。新生代メモリ=eden+2 survivor space;Sun公式推奨配置は全体の山の3/8です。
-XX:PermSize=128 M(メモリサイズ永久)
1、コンパイル後のクラスのオブジェクトを格納する場所、デフォルトの物理メモリの1/64は、システムの実際の状況に応じて設定することを推奨します。
-XX:+PrintGCDetails(印字gc詳細)
形式はたとえば
[GC[Partnew:839977 K-]1563 K(943744 K)、0.004890 secs]994555 K->15151563 K(3040896 K)、0.005340 secs)[Times=0.02 sys=0.01,real=0.01 secs]
[GC[1 CMS-initial-mark:629255 K(2097152 K)]631951 K(3040896 K)、0.006920 secs)[Times:user=0.00 sys=0.00,real=0.01 secs]
[CMS-concurrent-mark:1.385/1.385 secs][Times:user=4.80 sys=0.29,real=1.38 secs]
[CMS-concurrent-preclean:0.008/0.008 secs][Times:user=0.02 sys=0.00,real=0.01 secs]
[GC[Partnew:840636 K-]2737 K(943744 K)、0.007950 secs]1470119 K->632187 K(3040896 K)、0.008440 secs)[Times=0.03 sys=0.01,real=
0.01 secs]
[CMS-concurrent-abortable-preclean:0.696/1.471 secs][Times:user=2.48 sys=0.27,real=1.47 secs]
[GC[YG occupancy:424421 K(943744 K)][Rescan(parallel)、0.0519000 secs][weak refs processing、0.0017730 secs][1 CMS-remark:6294
50 K(2097152 K)]1053717 K(3040896 K)、0.0538830 secs(Times:user=0.32 sys=0.01、real=0.05 secs)
[CMS-concurrent-sweep:0.971 secs][Times:user=2.06 sys=0.19,real=0.97 secs]
[CMS-concurrent-reet:0.012/0.012 secs][Times:user=0.02 sys=0.00,real=0.01 secs]
具体的な内容説明は詳しくご参照ください。http://blogs.oracle.com/poonam/entry/understanding_cms_gc_ロゴ
-XX:+UseParNewGC-XX:ParalelGCThreads=8-XX:+UseConcon Mark SweepGC(若い世代が並行して回収器を回収して並行して8スレッドの古い世代が同時に回収する)
1、若い世代に並列回収を勧め、同時にオペレーティングシステムのprocesserの個数に従って並列スレッド数を設定し、理論的に<=オペレーティングシステムのprocesser個数
2、老年世代による合併回収を提案し、同時に回収して中断回数を低減し、中断時間を減らすことを目標とし、システムに対する応答時間に対して高い要求があるサービスに適用する。
-XX:CMSInitiatgOcyFract=30-XX:+UseCMSCompactAtFulCollection-XX:CMSFullGCs BeforeComppaction=1
古い世代に対して同時に回収するパラメーターは最適化します。
1、-XX:CMSInitiatgnicyFract=30
十分な空間を予約してyoung gcに与え、young gcから大きなメモリブロックを来ることを防止します。若い世代には十分な空きスペースがないので、メモリを提供できません。早く回収した後の割り当てができません。強制的なfull gcを引き起こして、長い時間のスレッドの中断を引き起こします。
2、-XX:+UseCMSCompactAtFulCollection
FULL GCに設置された時、若い世代に対する圧縮;CMSはメモリを移動しないので、これは非常に壊れやすく、メモリが足りないため、メモリの圧縮はこの時に有効になります。このパラメータを増やすのは良い習慣です。性能に影響があるかもしれませんが、破片を除去することができます。
3、-XX:CMSFullGCs Before Comppaction=1
何回かフルgcを設定してメモリ圧縮を行いますが、コンポジットはメモリ空間を圧縮したり、整理したりしないので、しばらく運転すると運行効率が低下します。この値は何回かのGCを運転してからメモリ空間を圧縮して整理します。
現在オンラインには多くの「Uloading class sun.reflect.Generant Serialization ControuctoAccess or」、「promotion failed」、「concurrent mode failure」のエラー、
この三つのエラーが発生した原因については、以下の文章を参照してください。
http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html
http://blogs.oracle.com/jonthecollector/entry/when_the_sum_of_the
http://blogs.oracle.com/jonthecollector/entry/what_the_heck_ズウ.a.
以上のように、原因は大体以下の通りです。
1、tenturedの予備空間が小さすぎる
2、youngの一回の回収のメモリ空間が大きすぎて、tenturedに連続的なメモリ空間を一回に割り当てることができなくて、需要を満たすことができません。
3、tenturedの空き容量が不連続で、破片が多い
現在のオンラインシステムは、テナントの空間予約を多く採用していますが、テナントのメモリ空間圧縮を採用しています。しかし、不定期には上記の三つのerrorが多く現れます。
-XX:CMSFullGCs Before Comppaction=0
このパラメータは、fullGCを何回か指定した後、tenturedのメモリ空間圧縮を行い、0の理解は毎回行うものとし、1に設定して生産管理を行うことを推奨します。
-XX:CMSFullGCs Before Comppaction=1
現在のサーバーごとの上記3種類のerror記録数は以下の通りです。
「Uloading class」「promotion failed」「concurrent mode failure」
50----------------2233--------------------------------------------------------------------------40
51----------------2544-------------------------------------------------------------------------6
61_CPS------------------------------------------------------------------------------------------------------------31
61_CPS 2---------------------------------------------------------480
62_CPS-------------------------------------------------------487
62_CPS 2-------------------------------------------------------------------------153
メモリ回収ログを分析し、-XX:CMSFullGCs BeforeComppaction=1パラメータを調整した後、安定を回収し、追加の「Uloading class sun.reflect.Generant Serialization Contront Access or」、「promotion failed」、「concurrent mode failure」のエラーがありません。
JDK 6のHotSpot VMの中で、Oracle/Sunは公式の支持のGCがCMSだけあって比較的に特殊です:その他のいくつかのGCの周期はすべて完全なstop-the-worldです。CMSの各合併GC周期は二つのstop-the-world段階があります。initial markとfinal re-mark、その他の段階はアプリケーションと同時に実行します。
したがって、「initial-mark」と「remark」の時間を監視することにより、gcによるプログラム中断問題を反映することができます。
-Xms3g -Xmx3g -Xmn1g -XX:PermSize=128M -XX:+PrintGCDetails -XX:+UseParNewGC -XX:ParallelGCThreads=8 -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=30 -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=1
現在の配置によって、オンライン環境jvmのゴミ回収効率が向上し、スレッド中断状況と中断時間が明らかに減少しました。-Xms 3 g-Xmx 3 g-Xmn 1 g(最大メモリヒープ最小メモリ新生代最大メモリ)
1、システム環境に応じてできるだけ合理的な値を設定することを提案する。
2、最大メモリと最小メモリはできるだけ一致するように提案します。jvmはメモリを動的に割り当て、メモリの一時的な引き締めによる再割り当てオーバーヘッドを低減するため、メモリ割り当ての安定性を向上させる。Xmsと-Xmxはデフォルトでは物理メモリの1/64です。
3、できるだけ新生代メモリをシステムに合った値に設定し、小さすぎる設定を避けることを提案します。新生代メモリ=eden+2 survivor space;Sun公式推奨配置は全体の山の3/8です。
-XX:PermSize=128 M(メモリサイズ永久)
1、コンパイル後のクラスのオブジェクトを格納する場所、デフォルトの物理メモリの1/64は、システムの実際の状況に応じて設定することを推奨します。
-XX:+PrintGCDetails(印字gc詳細)
形式はたとえば
[GC[Partnew:839977 K-]1563 K(943744 K)、0.004890 secs]994555 K->15151563 K(3040896 K)、0.005340 secs)[Times=0.02 sys=0.01,real=0.01 secs]
[GC[1 CMS-initial-mark:629255 K(2097152 K)]631951 K(3040896 K)、0.006920 secs)[Times:user=0.00 sys=0.00,real=0.01 secs]
[CMS-concurrent-mark:1.385/1.385 secs][Times:user=4.80 sys=0.29,real=1.38 secs]
[CMS-concurrent-preclean:0.008/0.008 secs][Times:user=0.02 sys=0.00,real=0.01 secs]
[GC[Partnew:840636 K-]2737 K(943744 K)、0.007950 secs]1470119 K->632187 K(3040896 K)、0.008440 secs)[Times=0.03 sys=0.01,real=
0.01 secs]
[CMS-concurrent-abortable-preclean:0.696/1.471 secs][Times:user=2.48 sys=0.27,real=1.47 secs]
[GC[YG occupancy:424421 K(943744 K)][Rescan(parallel)、0.0519000 secs][weak refs processing、0.0017730 secs][1 CMS-remark:6294
50 K(2097152 K)]1053717 K(3040896 K)、0.0538830 secs(Times:user=0.32 sys=0.01、real=0.05 secs)
[CMS-concurrent-sweep:0.971 secs][Times:user=2.06 sys=0.19,real=0.97 secs]
[CMS-concurrent-reet:0.012/0.012 secs][Times:user=0.02 sys=0.00,real=0.01 secs]
具体的な内容説明は詳しくご参照ください。http://blogs.oracle.com/poonam/entry/understanding_cms_gc_ロゴ
-XX:+UseParNewGC-XX:ParalelGCThreads=8-XX:+UseConcon Mark SweepGC(若い世代が並行して回収器を回収して並行して8スレッドの古い世代が同時に回収する)
1、若い世代に並列回収を勧め、同時にオペレーティングシステムのprocesserの個数に従って並列スレッド数を設定し、理論的に<=オペレーティングシステムのprocesser個数
2、老年世代による合併回収を提案し、同時に回収して中断回数を低減し、中断時間を減らすことを目標とし、システムに対する応答時間に対して高い要求があるサービスに適用する。
-XX:CMSInitiatgOcyFract=30-XX:+UseCMSCompactAtFulCollection-XX:CMSFullGCs BeforeComppaction=1
古い世代に対して同時に回収するパラメーターは最適化します。
1、-XX:CMSInitiatgnicyFract=30
十分な空間を予約してyoung gcに与え、young gcから大きなメモリブロックを来ることを防止します。若い世代には十分な空きスペースがないので、メモリを提供できません。早く回収した後の割り当てができません。強制的なfull gcを引き起こして、長い時間のスレッドの中断を引き起こします。
2、-XX:+UseCMSCompactAtFulCollection
FULL GCに設置された時、若い世代に対する圧縮;CMSはメモリを移動しないので、これは非常に壊れやすく、メモリが足りないため、メモリの圧縮はこの時に有効になります。このパラメータを増やすのは良い習慣です。性能に影響があるかもしれませんが、破片を除去することができます。
3、-XX:CMSFullGCs Before Comppaction=1
何回かフルgcを設定してメモリ圧縮を行いますが、コンポジットはメモリ空間を圧縮したり、整理したりしないので、しばらく運転すると運行効率が低下します。この値は何回かのGCを運転してからメモリ空間を圧縮して整理します。