Java仮想マシンの深い理解 - 高い同時実行VisualVMのプロジェクトのパフォーマンス分析を活用する方法

Java仮想マシンの深い理解一連の記事全文を更新...

我々はJVMのパフォーマンスVisualVMのを分析することを選んだので、良いのためのIDEA、IDEAとVisualVMのの一般的な使用するので、JVMの知識を学ぶことで、フロントには、一般的に、分析に関連するパラメータを使用する必要があり、分析は、一般的に、いくつかの解析ツールを使用する必要がありますこの記事では説明しますVisualVMのパフォーマンス分析に使用する方法をいくつか知っているだけでなく、分析の前に必要性をGC-最適化の原則GCの最適化の目的をだけでなく、彼らは問題が発生したときに問題を解決するためにどのような方法

1はなぜ必要なのですか

大規模なJavaアプリケーション・プロセスの開発は、必然的にメモリリーク、パフォーマンスのボトルネックや、接続ファイル、ネットワーク、未発表のデータベース、非最適化アルゴリズムなどの他の問題に遭遇します。アプリケーションの連続運転は、システム全体の運転効率の低下をもたらすことができると、それは深刻なクラッシュの原因となります。多くの場合、後半分析し、アプリケーションのパフォーマンスを最適化するために、パフォーマンス分析ツールの使用を開発するプロジェクトでは、これらの問題を隠すためのプログラムを検索するには。

VisualVMが無料パフォーマンス分析ツールです。これは、さまざまな方法で実行されているプログラムからのリアルタイムデータは、JMX、SA(保守エージェントは)APIを取り付け、同様に、そのダイナミックなパフォーマンス分析というのjvmstatです。同時に、それは自動的に、アプリケーションのパフォーマンス分析結果への影響を最小限に抑え、パフォーマンス分析の精度を向上させるために、より速く、より軽量な技術を選択することができます。

2インストール方法

2つの方法があります。

  • IDEAプラグインに従っていませんでした

あなたはIDEAプラグインに従わなかった場合、我々は次のディレクトリビンに従って手続きのJDKの実装を見つけるために見つける必要があります。

次のようにダブルクリックして実行、インターフェースは、表示されます。

しかし、我々は一般的にそうなりますプラグインの使用は、このように次のようである、IDEAを使用しています。

  • IDEAプラグインによります

まずVisualVMのプラグインがインストールを見つけます。

インストール後、VisualVMのを実行している場所は、さらに2つのボタンが表示され実行されます。

このプログラムを実行した後、それが自動的にVisualVMのプログラムを開くことができます。

3基本はじめに

最初の部分は、このツール、我々はそこに基本的な機能を使用するかを見ての簡単な紹介です。

他のプラグインを添加せずにそれだけでいくつかの関数を下回る場合。

3.1概要

示されているように、基本的にはチャート上に私たちの概説、システムプロパティを使用すると、プログラムの実行時にJVMパラメータを設定するなど、現在の情報にそうし、この部分は、私たちは、この情報を表示することができます。

3.2モニタリング

このインタフェースの機能を監視することはまだ非常に役割である、あなたが見ることができるカップラン、ヒープ使用状況のダイナミクスだけでなく、スレッドのクラスの場合を

したがって、我々は良いCPUの悪い状況を確認するには、このインターフェイスを使用することができ、より重要なのは、私たちは私たちのためにJVMを分析することは非常に重要である、ヒープの使用を確認することができます。

3.3スレッド

図のよう。そのため、状況がすべてのスレッドがされていることがわかる、寝て待って、居住者を監視し、実行しているというように。

注意これらのキーではありません、キーは非常に重要な機能もありVisualVMのある、あなたは、プラグインはより多くの機能を得る追加することができます。

3.4アドオンプラグイン

これは、このツールは非常に強力であるので、VisualVMのは、次の操作を行うことができ、ためのプラグインと拡張機能は次のとおりです。

  • 仮想マシンプロセスの表示構成および処理環境情報、JPS、Jinfoの。
  • CPU、GC、ヒープ、ならびに情報スレッド(JSTAT、jstack)メソッド領域のアプリケーションを監視します。
  • ヒープダンプ解析および転送保存されたスナップショット(jmapは、jhat)。
  • 他の多くの機能があります。

使用可能なプラグインを探す>、インストールすることができます - ツールで。

既にインストールされているプラグインの使用について、次のセクションVisual GCの分析のために。

4使ってVisual GC、仮想マシンのメモリ領域の分析を

あなたは、このセクションを表示することができます前に、この記事を参照してくださいので、このセクションでは、Java仮想マシンの基礎の一部を使用します:

このインタフェースでは、以下のセクションに分割されています。

  • スペース(メタスペース(メタデータ)、旧古い時代、新生代(エデン、S0、S1))
  • グラフ(コンパイル時(コンパイル時)、クラスローダの時間(クラスのロード時間)、GC時間(ガベージコレクション時間)、エデンスペース、サバイバー0、サバイバー1、旧世代、メタスペース)
  • ヒストグラム(パラメータパラメータ設定)

だから、後にそれが良いか悪いか、最後に実行中の仮想マシンを分析する方法、これらのパラメータを知って、この時間は、我々はいくつかの最適化の知識ベースのJava仮想マシンを理解する必要があります。

まず、我々はいくつか理解する必要がGCの最適化の原則を

  • ほとんどのJavaアプリケーションは、サーバー上のGCを最適化する必要はありません。
  • 問題我々はパラメータエラーが設定されていないので、GC Javaアプリケーションにつながるが、コードの問題のほとんどは、
  • オンライン・アプリケーションの前に、JVMがマシン(最適な)の最適なパラメータに設定されている検討します。
  • 作成されたオブジェクトの数を減らします。
  • グローバル変数およびラージ・オブジェクトの使用を減らします。
  • GCの最適化は、最後に使用する最後の手段です。
  • 実際の使用において、最適化されたコードGCパラメータ最適化の場合よりもはるかに多くのGC分析。

また、私たちは知っている必要があり汎用GCの最適化を

  • 古い時代に転送されるオブジェクトの数を最小限に抑えています。
  • フルGCの実行時間を削減。

一般的には、以下の点は、私たちは何をする必要があります。

  • グローバル変数およびラージ・オブジェクトの使用を減らします。
  • 新世代に最も適したサイズを変更します。
  • セットの古いサイズが最も適切です。
  • GCは、適切なコレクタを選択します。

私は例を挙げて説明します後ろ、右の計算方法について。

あなたが詳細を知りたい場合は実際には、JVMのメモリ割り当てと回復の戦略の原則を、あなたはこの記事を閲覧することができます:原理JVMのメモリの割り当てと回復の戦略を

我々は一般的なプログラムを実行した後、次のステップはする必要があることであるGCの状態を確認した後、その結果を分析するかを決定するために、最適化の必要性が

あなたは以下の一般的な達成した場合の指標を、それがGCを必要としません。

  • Minor GC実行時間未満50msMinor GCしないで頻繁に、およそ10毎秒一回。
  • Full GC実行時間未満で1sFull GC実行頻度はない未満、頻繁ではない10分当たりに一度。

例1

我々は、この例では、ヒープ割り当て最大値または最小値を与える、最適化されるGCの状態の例を見ている64M(小さなヒープサイズ)。

GC分析悪い状態
/**
 * VM Args:-Xms64m -Xmx64m -XX:+HeapDumpOnOutOfMemoryError
 * @author 欧阳思海
 */
public class HeapTest {

    static class StaticObject {
    }

    public static void main(String[] args) {
        List<StaticObject> list = new ArrayList<StaticObject>();
        int i = 1;

        //不断的向堆中添加对象
        while (true) {
            list.add(new StaticObject());
            i++;
            System.out.println(i);
            System.out.println(list.size());
        }
    }
}
复制代码

なぜなら割り当てられたヒープメモリのスタックオーバーフロー、その結果、小さすぎます。

その後、我々は見てVisual GC状況を監視します。

  • 状況を監視インタフェース

私たちは、ヒープの使用から見ることができ、それは基本的に、最大使用されてきました。

  • 状況を監視するには、Visual GC

短時間でフィギュア、操作から見ると、エデンは時間が短いですが、GC 49だったが、問題は、新世代のスペースを説明することができ、頻繁GCで、その結果、ヒープメモリが小さすぎる割り当てられます

一方、旧歳も実行している時間が必要とされていない最適化の範囲内であるが、サバイバー、基本的にはノーGC、これらのオブジェクトの記述は、古い古い年に大規模な、直接アクセスされ、その結果から見ることができますが、33 GC実施頻繁にGC

そこで、我々は、最適化が必要な大規模なオブジェクトを削減しながら、古いものと新しい世代のヒープメモリのサイズを大きくします

最適化パラメータ

私たちは、VMパラメータを変更します:-Xms512m -Xmx512m -Xmn128m -XX:+HeapDumpOnOutOfMemoryErrorについて実行されている5分、再び結果を確認します。

まず、ヒープオーバーフローが発生しません。

  • 状況を監視

それは何の問題もそうヒープメモリ、ヒープメモリを増加させました。

  • 状況を監視するには、Visual GC

ヒープメモリを増やすした後、古いは2歳であったエデン新生代は66回は、基本的に(約10秒間未満50ミリ秒の実行時間、マイナーGCは、ありません頻繁に行う)の要件を満たす時間3.381sを使用して、GCましたGCは、時間4.127sを使用して、ここでは、まだ最適化される最適化の要件を満たすことはほとんどありません。

  • ダンプファイルの解析

クリックしてヒープダンプこのボタンは、ダンプファイルを生成します、我々は、クラスとオブジェクトのいくつかの事例を分析することができます。

分析が見つかった後、StaticObjectほとんどのオブジェクトは、何のGC、ここでの主な問題は、その次のステップは、この問題を解決することではありません。

上記の分析によって問題を説明することができ、新しい世代と大幅に改善老齢のGCの場合、後のヒープメモリを増加させたが、そこでラージオブジェクトの問題は、それがまだ最適化されなければなりません。

ラージオブジェクト、GCを変更します。

次のようにプログラムを変更します。

/**
 * VM Args:-Xms512m -Xmx512m -Xmn128m -XX:+HeapDumpOnOutOfMemoryError
 *
 * @author 欧阳思海
 */
public class HeapTest {

   /* static class StaticObject {
    }*/

    public static void main(String[] args) {
        int i = 1;

        while (true) {
            i++;
            System.out.println(i);
        }

    }
}

复制代码
  • 状況を監視

ヒープは十分に実行されています。

  • 状況を監視するには、Visual GC

最終相対古い時代の状況が改善しているに比べて、何のGCがない、ラージオブジェクトが存在しないことを示しています。

上記の最適化と分析を通じて、それはGCのニーズを満たすためにある、最適化の必要はありません。

5まとめ

あなたは、Java仮想マシンと最適化の記事の知識を通じてより多く知っているこのシリーズの他の記事を見たい場合はVisualVMのVisualVMのは、Java仮想マシンを最適化することに使用する上記の分析と基本的な使用方法とを使用することにより、私は、あなたが既に知っていると信じています。

1、元は容易ではない、古い鉄、記事はあなたの必要親指をあなたに、より多くの人が見るように助けに希望を!

2は、記事では、あなたがまた私を心配することができます読み取るために、あなたのマイクロ手紙のような場合、私を修正してください不適切持つマイクロチャンネル公共数好好学java公共の数がされてい6W:ファン、回答1024、公共の数字まくるへのアクセス、長期的なリリースの公開数のJava記事の高品質シリーズ、我々は間違いなくあなたの収穫に多くの注目を与えます!

おすすめ

転載: juejin.im/post/5e09a8c5e51d45584b586ed6