JavaのアーキテクチャのJVMのチューニング

  1. JVMチューニングの基本1.1 Javaヒープ構造

  Javaヒープは限り論理的に連続することができて、不連続な物理メモリ空間上にあってもよいです。Javaヒープの割り当ては、オブジェクトの多様で、スレッド間で共有メモリ空間を、保存します。エデン領域、サバイバー領域、及び殿堂入り領域永久領域にJavaヒープ、以下に示すように。

  次のようにJavaヒープの割り当ての原則は以下のとおりです。

以下に示すようにJavaヒーププロファイル、クラスの新しいインスタンスエデンのほとんど(エデンワードは初期始動手段で表される理由)割り当て領域。エデンエリアが一杯になる、またはGCを必要なときに、まだ生きているオブジェクトは、生存者はまだ生きているオブジェクトの完全な地区は、他の生存者ゾーンにコピーされますとき、サバイバー領域に2つの遺族地区の合計がコピーされます。生存者ゾーンがいっぱいになったとき、生存上に第一ゾーンからコピーされ、ライブオブジェクトは、静的なファイルを格納するための古い世代(旧世代)パーマ世代にコピーされ、この時、永久的な世代のサイズはMaxPermSizeを行ってもよいです設定。

パーマ世代JVM常駐メモリは、JDKを格納するために使用される、独自のCLASS、メタデータ・インターフェースなどを運びます。この領域は、ガベージコレクタGCから回収されないデータにロードされ、JVMを閉じ、これは、制御されたメモリ領域を解放します。

ジャワのライフサイクルは、ヤングから終身、エデン終身の誕生から死までの期間に、ヒープ内のオブジェクト。EDENゾーンが十分でない場合には、マイナーGCをトリガする、GCは、オブジェクトが別のオブジェクトによって発見された場合、オブジェクトはその背後に、遺族のエリアに移動させながらオブジェクトは、破壊のために使用されなくなっている、ガベージコレクションのための領域をEDENません終身ゾーンはほとんどのオブジェクトのライフサイクルが非常に短いので、GCは、一般的に、エデンエリアに主要なGCよりもはるかに高いマイナーGCの発生頻度を発生するための主要なGC、ジャワと呼ばれる、GCの発生時に、類推。java.lang.OutOfMemoryErrorを:Javaのヒープ領域の最後の全体のヒープ領域がいっぱいになった場合、それは異常なJVMスペースのオーバーフローを破裂されます。

1.2 JVM GCアルゴリズムの列挙

回復アルゴリズムをマークされているマークスイープアルゴリズムは、objectタグ、その後、均一なリサイクルを回復する必要があります。このアルゴリズムは、パーマ、その収納スペースのパーマを代表に代わって、適切なオブジェクトが比較的大きいですし、あまり必要性を回復します。

コピーコピーアルゴリズムアルゴリズム、すなわち、直接コピー。エデン地区は、GCにする必要がありますオブジェクトのほとんどのため、生存者ゾーンのコピーのエデン対象領域、および小容量エデンエリア。

マーク・コンパクトマークされているアルゴリズムをソートアルゴリズム、異なるアルゴリズムのマークを削除し、タグのアルゴリズムを整理するためには、メモリの断片化の問題を回避し、それはすべてのライブオブジェクトが終了した「仕上げ」、メモリの一方の端部に向かって移動し、一端が物体側の生存ですその後、メモリの回復、および直接メモリをクリアするためにリサイクル。 

1.3 GCコレクタ

シリアルコレクター

   最も基本的な、最古のコレクター。これは、アプリケーションが停止され、シングルスレッドコレクタ、GC処理、すなわち、ストップ世界を。

Parnewコレクター

   実装コード、これはマルチスレッドコレクタであることを除いて、ほぼ同じシリアル。

Paralled掃気コレクタ

   Paralledスカベンジャーコレクタは、コピーアルゴリズムを使用して、コレクタの新しい世代であり、マルチスレッド並列コレクタです。スループットを向上させることに焦点を当てた平行掃気コレクタ、スループットは次のように定義されます。 

 スループットは=ユーザプログラム実行時間/(ユーザープログラムの実行時間+時間のガベージコレクション)

シリアル古いコレクタ

   シリアルコレクタのシリアル古いの古いバージョン。

パラレル古いコレクタ

   昔の並列スカベンジコレクタのバージョン。マーカーを使用 - アルゴリズムをソートします。

CMS(並行マークスイープ)コレクター:並行マークスイープコレクター、コレクタを一時停止する最短時間でゴール。マークの使用 - スイープアルゴリズムを。 

  2.VisualVM1実際の状態監視JVM

2.1一般的なチューニングパラメータリスト

  ストレージスペースの総量を知るための主要な必要性がある、各領域の割合は、異なる地域の回収・リサイクルのためのアルゴリズムの異なるセットを提供します。デフォルトでは、いくつかのオプションが開いていないので、手動で独自のアプリケーションに応じて適切なパラメータを設定し、選択する必要があります。       

   GCログを表示し、分析するための2.2

    アプリケーションでは、日食は、GCは、ログファイルとして出力を保存し、工学的性質によってVMのプロパティを増やすことができます。              

    GCの出力オプション:

-XX:+ PrintGC GCは、ログ出力を-XX:GCの+ PrintGCDetails出力詳細なログを

-XX:+ PrintGCTimeStamps GC出力タイムスタンプ(基準時間の形で)

-XX:+ PrintGCDateStamps GC出力タイムスタンプ(日時の形で、例えば2013-05-04T21として:53:59.234 + 0800)

-XX:+前とPrintHeapAtGC中のGCは、情報ヒープをプリントアウト

-Xloggc:../出力パスのログ/ gc.logログファイル

の形式で出力をログに記録します。

計算は単純な再帰プロシージャFibbonaccy数列を調製し、そして最終的にSystem.gc()全力をGCを追加し、0エデン領域の量を用いて以下のようにして得られたGCログが、回復しました。アプリケーション稼働のサーバタイプは、必然的にGCを繰り返すことになる場合には、そのような時代のフルGC過剰な数としてGCログでパフォーマンスの問題を見つけることは比較的簡単にすることができます。

テスト環境:

  JVM:は、Java HotSpot(TM)クライアントVM(25.60-B23、混合モード、共有する)は、Java:バージョン1.8.0_60、ベンダーオラクル株式会社

ステップ1:

監視インターフェースは、視覚的に、各領域のJVMのメモリ使用量を見ることができます。仮想マシンの監視に加えて、あなたはまた、メモリ使用量のアプリケーションを監視することができます。起動を最適化しようECLIPSE、あなたは明らかに日食が始まるとき、S0 S1オブジェクトがコピーし、古い地域の若干増加量を見ることができます。

また、ロードされたクラスとスレッドの数を現在のCPUやメモリの負荷を監視できます。

ステップ2:

そこインストールディレクトリ日食で.iniファイル、日食のプロファイルパラメータ、すなわち、必要な構成を記入して行きます。Eclipseを起動した後、私は約6〜7秒、非常に遅いQiazhiyisuan、GCログを参照し、全体のブートプロセスは、3回のフルGCを持っている場所27 GCパーティーを取った、全体のプロセスを開始

パラメータ-XX:NewSizeパラメータ= Nエデン地区は日食が再び発見された開始、今回はそれが唯一の11倍GC、速くオリジナルよりも大幅に速度を開始するよりも一般的で下落が起こった、128メートル後にリセット。

ステップ3:

次いで-Xverifyを使用して:なし禁止バイトコード検証手順をクラスをロードするとき、GC 10の数は、今や実質的に3秒以上程度の速度を開始、オリジナルよりも高速で倍増しました。

しかし、この粗すぎるチューニング、プログラムは、より多くのパラメータをデバッグする必要がある、サーバー上でより正確な位置決め時間を要します。

  まずここに書いています。    

  

ます。https://juejin.im/post/5d0725cc5188255fc638480eで再現

おすすめ

転載: blog.csdn.net/weixin_34198583/article/details/93181931