前の投稿: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プログラミングの場合...作業実稼働環境は頻繁に再起動されます。