原理学習の基礎となるJVMのチューニング方法(6)

前の投稿:JVMの基本原則を学習するためのチューニングツール(5)

JVMチューニング方法

防止

  • 標準化されたコード、より高性能なコード。少しずつ始めます。

    • 可変スコープ
    for (int i = 0; i <10000000 ; i++) {
    	int mid = 10000;
    }
    
    • StringbufferまたはStringBuilderを使用するには、文字列操作をお勧めします

    front = front + "hello" + "wolrd" + "a" + "b" + "c" + "d";
    定数プールにhellowolldabcd文字列定数を作成します。つまり、文字列をStringと連結すると、定数プールに無用な定数が多数生成され、メモリスペースが消費されます。1つまたは2つのStringは大したことではありませんが、合計するとさらに多くなります。文字列連結文字は、コード。文字列、それは大きな消費です。

    • イテレータ反復のエレガントな記述
      ここに画像の説明を挿入
    • ArrayListの実装とSpringIOCコンテナでのBeanのレイジー戦略
      ここに画像の説明を挿入
      ここに画像の説明を挿入

    コードArrayListlist = new ArrayList();を渡すと、基になるデータオブジェクトの構築は完了しませんが、Addメソッドの最初の使用時にデータオブジェクトの構築は完了します。

    • シングルトンモードでのロックの再確認
      ここに画像の説明を挿入
    • 同時実行性が高い場合、同期呼び出しではロックのパフォーマンスの低下を考慮する必要があります。ロックフリーのデータ構造を使用できる場合は、ロックを使用しないでください。
      ブロックロックできる場合は、メソッド本体全体をロックしないでください。オブジェクトロックを使用できる場合は、ツールのコレクションを使用しないでください。クラスロックと同期したconcurrentHashMap
      ここに画像の説明を挿入
    • スレッドまたはスレッドプールを作成するときは、エラーが発生したときに原因を追跡しやすくするために、意味のあるスレッド名を指定してください
    class MyThead extends Thread {
    	public MyThead() {
    		super.setName("MyThread");
    	}
    }
    

    標準化されたコードの育成方法については、「EFFECTIVEJAVA」をご覧ください。JDKデザイナのソースコード実装を確認します。
    これらのオープンソースフレームワークのソースコードをバブルします(ソースコードを確認し、それに固執します)。優れたプログラミング習慣とプログラミング仕様を開発します。コメントを頻繁に書き込みます。

  • 適切なハードウェア設備とソフトウェアバージョンを選択する

あなたのビジネスのためにハードウェア計画をうまくやってください。私たちが1000WTPSをサポートして、非常に味のないサーバーを提供するのであれば、それは絶対に不可能です。事前にビジネスに基づいてハードウェア計画をうまくやってください。たとえば、良いものを選択してください。 CPUを多用するビジネスに適したCPU。IOを多用するビジネスに適したIOディスクを選択します
。JVMでヒープのサイズをできるだけ大きくします。
ソフトウェアのバージョンと選択では、安定している必要もあります。新しいものを追いかけないでください。ただし、怒っています
。Tomcatなど、サーバーを構築することは可能ですが、8.0以降のバージョンではデフォルトのNIO IO方式が使用されます。処理パフォーマンスが大幅に向上します。たとえば
、Nettyの最高バージョンは5.Xです。ただし、公式の後5.0リリースでは、Netty5.Xバージョンのメンテナンスが停止されたことが発表されました
。JDKバージョン選択の時点で、可能な限り良い評判、マルチバージョンの使用を選択しています。

  • 高並行性と高可用性のアーキテクチャーとストレステストをうまく実行する

アーキテクチャ設計者として、機能要件の偏りはあなたの義務であり、非機能要件の設計と保証はあなたの価値の表れです。システム
の高可用性、高並行性、および高性能は、次の3つの高い指標です。設計者私たちは全体的な状況の真っ只中に立ち、全体的な状況を管理する必要があります。幼児期にはすべてのリスクを回避しましょう。

  • 早期警告とタイムリーなトラブルシューティングのための監視システムをセットアップします

Hawkeye、Prometheus、Zabbix

トラブルシューティングと分析

  • CPUの急上昇

プロセスはtopコマンドに基づいて
チェックされ、CPU使用率が過剰なスレッドはtop -Hpに基づいて検出され、ツールでコードをチェックします。

  • スレッドブロッキング/スレッドデッドロック

jstackまたは一般的なツール(Jvisualvmまたはarthas)を使用して、スレッドのステータスを確認します。ロック状況

  • JVMはOOMと表示されます

java.lang.OutOfMemoryError:javaヒープスペース
ヒープオーバーフロー。メモリリークの問題があるかどうかを確認します。スタックオブジェクトの状況を分析します。java.lang.OutOfMemoryError
:メタスペース
はJVMクラスの読み込みで確認できます。Jstatまたはリアルタイム監視ツールcheck ...
code levelバイトコード生成ツールを介して多数のクラスファイルが生成されているかどうか、反映されたクラスと呼び出しメソッドが多数あるかどうか、および多数の動的プロキシプロキシクラスバイトコードが生成されているかどうかを確認し
ます。java.lang。 OutOfMemoryError:GCのオーバーヘッド制限が
システムを超えました。高頻度のGC状態で、回復効果がまだ良くない場合は、GCログ曲線収集スタックの分析とトラブルシューティングを分析してください。

  • ビジネスの反応が遅い

1.機械自体の性能が不十分です。高い同時実行圧力に対応できません。小さな馬車は絶対に引っ張ることができません。2。コールチェーンは短いボード効果
があります分析することで確認できますスレッドのステータス。IOが多すぎる、IO容量が不足している3. GC収集プロセス
時停止時間が長すぎる最初に、GCログを分析する必要があります。分析結果に基づいて、一般的な理由を見つけることができます。たとえば、メモリ割り当てが十分でない(JVMが起動すると20Mを占める。合計25Mがある)、またはガベージコレクターの選択が不合理である。
一時停止時間優先ガベージコレクター、または一時停止時間制御可能ガベージコレクター
(CMSまたはG1)
CMSは、GC同時モード障害(重大な断片化)にも注意する必要があります。同時モード障害は、シリアルガベージコレクターに縮退します。

解決

  • ビジネス特性と監視データに基づいて適切なJVMパラメータを調整します
    • スタックへの割り当てはデフォルトで有効になっています
    • デフォルトでTLABをオンにする
    • 各スペース比率の適応調整を許可するはデフォルトで有効になっています
    • 最小ヒープと最大ヒープが一貫するように設定します。ヒープのスケーリングによって引き起こされるパフォーマンスの消費を防ぎます。
    • 適切なスタックサイズを設定します。スタックの深さが3000〜5000であることを確認します。
    • ガベージコレクターとCPUハードウェアに適切な数のガベージスレッドを設定します。
    • ビジネスの特性とプログラム内のオブジェクトの特性に応じて、老後のオブジェクトに妥当な臨界年齢を設定します
  • ビジネスとメモリのサイズに基づいて適切なガベージコレクタを選択します

スモールメモリ(500M以内)、クライアントはwinプログラムを実行し、
シリアルシリーズを選択できます
ミディアムメモリ(500M-4G)、サーバー側では、PSPOなどのスループットを追求する並列ガベージコレクターを選択できます。
ラージメモリ(4G以上)、サーバー、JDK1.8以上の場合、G1を選択する必要があります。

  • 問題を回避し、ソフトウェア設計レベルから最適化する
    • 大規模な並行システムの場合:ブラウザーキャッシュ、ローカルキャッシュ、検証コード、現在の制限コンポーネントの導入などを設計します。
    • ホットスポットサービスインターフェイスは、ブラシ防止、電源、およびその他の関連戦略をサポートする必要があります。
    • 合理的なビジネスの垂直分割により、単一のJVMサービスロジックの肥大化と集中が軽減されます。
    • サーバープログラムは、適切な数のサービススレッドと、Tomcatチューニングなどのスレッド再利用メカニズムを設定します。
    • クラスター+負荷分散サービス展開ソリューションを使用して、単一ポイントのパフォーマンスのボトルネックと同時実行性のプレッシャーを軽減します
    • コールチェーンが長すぎる場合は、メッセージキューを使用して非同期メッセージを実装できます。これにより、スタック呼び出しの深さを減らすことができます。

最終的な解決策(学ばないでください)

Baiduプログラミングの場合...作業実稼働環境は頻繁に再起動されます。

おすすめ

転載: blog.csdn.net/nonage_bread/article/details/108229947