ツールの概要、第V章チューニング事例研究と実用を監視し、トラブルシューティングの章VMパフォーマンス:蘇は世間話JVMを温めます

このシリーズは、記録簿の研究ノートの「Java仮想マシンの深い理解」に使用されています。簡単には自分で見るが、また、アクセスを容易にします。

速攻は速攻で廃棄物を作る到達するために無駄になります!

第IV章仮想マシンのパフォーマンスツールの概要を監視とトラブルシューティング

A、JDKのコマンドラインツール

1、JPS:VMプロセス・ステータス・ツール

あなたは、仮想マシンがメインクラスを実行プロセスとディスプレイを実行している仮想マシンの一覧表示することができます(メインクラスをどこ)これらのプロセスの名前だけでなく、ローカルの仮想マシン固有のID(ローカル仮想マシン識別子lvmidは)

2、JSTAT:仮想マシンの統計情報のモニタリングツール

JSTAT(監視ツールJVM統計)状態の様々な情報を実行中の仮想マシンを監視するためのコマンドラインツールである、それはの不存在下で、クラスのロード、メモリ、ガベージコレクション、JITコンパイラおよびその他の動作データの過程で、ローカルまたはリモートの仮想マシンを表示することができますあなたが選択したツールを配置する仮想マシンのパフォーマンス上の問題で、それを実行するだけで、テキストのみのコンソールサーバー環境で利用可能なGUIグラフィカルインターフェース、。

3、Jinfoの:Java構成ツール

ロールJinfoの(Javaのためのコンフィギュレーション情報)がリアルタイムで表示され、仮想マシンのパラメータを調整します

4、jmapは:Javaのメモリマッピングツール

jmapの(javaに関するMeroryマップ)コマンドは、(一般的にheapdumpまたはダンプ・ファイルと呼ばれる)、ヒープダンプのスナップショットを生成するために使用されます

5、jhat:仮想マシンのヒープダンプ解析ツールのスナップショット

日JDKは、生成されたヒープダンプ解析jmapのjhatの使用とjhat(JVMヒープ解析ツール)コマンドjmapのは、HTTP / HTMLサーバーのミニチュアスナップショットを構築し、生成した解析結果はファイルがブラウザで表示することができますダンプに提供した後。

6、jstack:Javaスタックトレースツール

jstack(Java用スタックトレース)コマンドが(一般ファイルをthreaddumpまたはjavacoreの収集と呼ぶ)は、現在の時刻をスレッド、仮想マシンのスナップショットを生成するために使用される、スレッドのスタックは、現在の仮想マシンのアプローチのスナップショットの集合である各実行スレッド、スレッド生成スナップショット主な目的は、長い待機このようなスレッド間のデッドロック、無限ループ、外部リソース要求として長い休止を、表示等スレッドを配置することであるスレッド長い休止の一般的な原因であり、jstackを通じて確認する休止時間スレッド各スレッドの呼び出しスタック、あなたは何かやリソースを待って、バックグラウンドで行われる最終のものでスレッドを応答していないことを知ることができます。

StackTraceElementは、すべてのスレッドのためのオブジェクトの仮想マシンを取得するために使用getAllStackTreces()メソッドを追加しますJDK1.5 java.lang.Threadのクラスでは、あなたは、コードのいくつかの簡単なラインを介して、ほとんどの機能jstackのを完了するために、このメソッドを使用することができます管理者は、いつでもスレッドスタックを表示するブラウザを使用することができ、実際のプロジェクトのページになるように、このメソッドを呼び出すこともできます。

<%@ page import="java.util.Map"%>

<html>
<head>
<title>服务器线程信息</title>
</head>
<body>
<pre>
<%
    for (Map.Entry<Thread, StackTraceElement[]> stackTrace : Thread.getAllStackTraces().entrySet()) {
        Thread thread = (Thread) stackTrace.getKey();
        StackTraceElement[] stack = (StackTraceElement[]) stackTrace.getValue();
        if (thread.equals(Thread.currentThread())) {
            continue;
        }
        out.print("\n线程:" + thread.getName() + "\n");
        for (StackTraceElement element : stack) {
            out.print("\t"+element+"\n");
        }
    }
%>
</pre>
</body>
</html>

7、HSIDS:JIT生成されたコードのコンパイル

HSIDSは、Sunの公式のHotSpot仮想マシンのJITコンパイルされたコードの逆アセンブルプラグをお勧めです

二、JDKの可視化ツール

1、JConsoleの:Java監視および管理コンソール

JConsoleの(Javaの監視および管理コンソール)は、JMXのMBeanを管理するための管理機能の一部であるJMX管理ツールに基づいて視覚的モニタリングで、MBeanのコードは、管理コンソールまたはJMX仕様に準拠したミドルウェアサーバーソフトウェアを使用することができますアクセス。

2、VisualVMの:イン・ワントラブルシューティングツール

VisualVMは(オールインワンのJavaトラブルシューティングツール)は、操作の監視とトラブルシューティングの手順の中で最も強力な機能のリリースで抜いてJDKであり、時間の次の期間中のツールのトラブルシューティング仮想マシンがメインの政府開発で期待することができますソフトウェアの公式VisualVMのは、運用監視に加えて、トラブルシューティングには、だけでなく、パフォーマンス分析、VisualVMののパフォーマンス分析など他の多くの機能を提供することを示唆し、単語の「オールインワン」の記述を書きましたJProfilerをYourKitのも、他の専門家報酬およびプロファイリングツールに比べてはるかに少ない機能ではありませんし、VisualVMの大きな利点がある。したがって、そのアプリケーションの実際のパフォーマンスで実行されている特別なエージェントプログラムを監視する必要がない影響それは、本番環境で直接使用することができるほど小さい、この利点はJProfilerをYourKitであり、他のツールがで比較することはできません。

第V章チューニング事例研究や実用的な

「Java仮想マシンの深い理解」で書籍の主な内容は、自分の仕事の過程で、チューニングには、このセクションの実際の戦闘でいくつかの経験の著者についてです。読者のために、分析の焦点は、問題を解決するための具体的なアイデアを学ぶことです。

時間やコンパイル時のクラスのロードを最適化まず、

コンパイル時間は、時間のかかる仮想マシンJTIホットスポットコンパイラのコードです。

仮想マシンは、回数、特定のプログラムは、それが高速に実行、ネイティブコードへの時間のコンパイル、ホットコードのためのJITコンパイラに判断されますが、これはホットスポット仮想マシン名である場合、Javaメソッドが呼び出され、2ランタイム・コンパイラを構築しました起源。

2、高性能なハードウェアの展開戦略上のプログラム

1.基本情報について

(1)環境は、15万/日、オンラインドキュメントタイプのウェブサイトについてのPVは、最近のハードウェア・システム、新しいシステムのハードウェア4 CPUを交換し、物理メモリの16Gは、OSは、Webサーバーなどの樹脂、64ビットのCentOS5.4です。

(2)説明:全体のサーバーが一時的に他のアプリケーションを展開されていない、すべてのハードウェアリソースがトラフィックに提供することができるが、サイトの使いすぎではありません。管理者は、選択された64ビットのJDK1.5のハードウェアリソースの利用率を最大化し、12ギガバイト固定-Xms -XmsパラメータJavaヒープによって。

(3)問題:いくつかの時間のために使用した後の使用は、応答のない長い時間のためのサイトが多い不規則な現象で満足のいくものではないことがわかりました。

(4)調査は:モニタリング後にサーバヘルスサイトは15に12ギガバイトのヒープをリサイクル、フルGC休止時間を伴うGCに応答していないサーバーモード、優先度のコレクタスループットデフォルトで実行中の仮想マシンを引き起こし一時停止がことがわかりました秒。なぜなら文書へのアクセスは、メモリの文書シーケンスによって生成された多くの大規模なオブジェクトで、その結果、ディスクからメモリに抽出した文書すべきプログラムの設計、古い時代にこれらの大きなオブジェクトの多くは、登場し、マイナーGCで洗浄ませんアウト。この場合、ヒープメモリの12ギガバイトがあってもすぐに10分で、その結果、枯渇する10秒ごとに表示されます一時停止します。

(5)分析:最初の問題は、プログラムコードを議論するために拡張しない、主な問題に配備プログラムは明らかに長い休止をリサイクルする際に大量のメモリヒープを引き起こしました。32ビットシステムのハードウェアを使用すると、1.5ギガバイトのヒープをアップグレードする前に、唯一の遅いWebサイトのユーザーエクスペリエンスを訪問しますが、Javaのヒープメモリに再スケーリング場合は非常に重要な一時停止は、そのプログラムの有効性を改善するためのアップグレードハードウェアを検討する前に、発生しません、そして、ハードウェアへの投資が無駄になります。

2、高性能なハードウェアの展開の実施形態

主に2つの方法があります:

大容量メモリ64を用いて、(1)JDK

(2)ハードウェア・リソースを使用して論理クラスタを確立するために、32ビットの仮想マシンを複数用いて

図3に示すように、64ビットの大容量メモリで使用されるJDK

ユーザーとの対話のためのシステムの滞留時間に敏感で、強いです、あなたはJava仮想マシンのヒープ前提が完全GC制御周波数アプリケーションの低十分の自信を持っている以上、少なくとも低いこのような10のように、ユーザーには影響しませ割り当てることができます数時間またはFull GC一度表示される前であっても一日、それも自動的にサーバが深夜に実行タイミングのタスクを介して完全なGC出発可能な安定したレベルのメモリ空間に維持するために再起動することができるように。

フルGC周波数制御キーは、すなわち「オフChaoshengの夜」の原則に沿って、オブジェクトの絶対多数のアプリケーションは、ほとんどのオブジェクトの生存期間が長すぎる、特に大規模なオブジェクトの長い生存期間のバッチを生成しないすべきではないかどうかを確認することです、安定の古いスペースを確保するために。

申込書のほとんどのサイトでは、メインターゲットのライフサイクルは、レベルまたはページレベル、セッション・レベルおよびグローバルレベルの長寿命オブジェクトの相対的な減少を要求する必要があります。ロングコードは、合理的で書かれており、彼らは完全なGCなしの通常の使用の大きなヒープに達成することができるはずとして、そう、大きなヒープメモリ、サイトの応答速度を使用している場合は、より確実だったよう。読者が大量のメモリを管理するために、64ビットJDKを使用する場合は加えても、我々はが直面している次の問題を考慮する必要があります。

(1)は、長い休止ガベージコレクションによって引き起こされます

(2)段階は、64ビットJDKの性能試験の結果は、一般的に32 JDKよりも低いです

(3)農産物は(あなたがGBの何百またはさらに大きなダンプファイルを生成したいので)ヒープオーバーフローヒープ・ダンプのスナップショットを作成することはほとんど不可能であるならば、それはスナップショットを作成する場合でも、このアプリケーション以来、十分な安定性プログラムを確保する必要が解決するのはほとんど不可能です。

(4)膨張し、そのデータ型へのポインタとパディングに起因する他の要因によるものである32よりも一般に大きいメモリ64 JDK JDK、で消費と同じ手順。

図4に示すように、ハードウェア・リソースの論理的な利用を作成するために、32ビットの仮想マシンのクラスタの番号を使用して

具体的なアプローチは、アプリケーションサーバプロセスの複数の物理マシン上で起動する各サーバに異なる分配ポート、及びその後の割り当て方法リバースプロキシアクセス要求にフロントエンドロードバランサを構築することです。読者があまりにも、64ビットJDKと消費イコライザーフォワーディング性能、心配する必要はありませんが、多くのアプリケーションは、非常に多くのアプリケーションが存在し、常にイコライザーステージを事前つ以上のサーバーよりも持っています。

単一の物理マシン上の論理クラスタを確立する目的は、ハードウェアリソースの唯一の可能な使用での高可用性の要件は、各仮想マシンは絶対的に正確なバランスプロセスを持っていることを確認する必要はありません、状態の保持、熱転写などを気にする必要はありません。負荷は、その親和スタイルのクラスタを使用して何のセッションレプリケーションは、非常に良い選択ではありません。我々だけで一定のルールに従ってイコライザーアルゴリズムは常にプログラム開発相は、基本的にクラスタ化された環境のために何もしないように、固定ユーザーは、クラスタノードへの固定割り当てを処理できる要求されます、つまり、クラスタは、親和性を持っていることを確認する必要があります特別な配慮。

5、論理クラスタの展開モードを使用するには、次の質問のいくつかが発生する可能性があり

(1)は、ディスクファイルへの同時アクセスは、その後、(問題が同時読み取りおよび書き込み操作に特に傾向がある)場合、それは簡単にIO例外につながることができ、最も典型的には、ディスクの競争で、競争力のあるグローバルリソースノードを避けるために、各ノードを試してみてください。

他の人はまだ多くのスペアノードを持っていながら、通常、各ノードには、独自の独立した接続プールを確立し、このような接続プーリングなど、最も効率的なプールの特定のリソースを使用すること(2)困難な、これは完全ないくつかのノードの池につながることができます。あなたは集中JNDIを使用することができますが、複雑さのある程度があり、追加のパフォーマンスコストをもたらすかもしれないが。

(3)各ノードは、必然的に考慮し、一般的に1.5ギガバイトの最大に開いているヒープよりもメモリのオーバーヘッドを取るだけの32ビットWindowsプラットフォームプロセスあたり2GBのメモリに、32ビットのメモリ制限することが依然としてあります。一部のLinux、Unixシステムでは、3ギガバイトにアップグレードすることができますし、さらに近い4GBのRAMへ、しかし32は、4ギガバイトの最大メモリを制限するために、まだ(2 ^ 32)の対象となっています。

(4)各ノードは論理キャッシュを持っているため、ローカルキャッシュを考慮することができる、メモリ論理クラスタの大きな浪費をもたらす、アプリケーションの(例えば、いわゆるハッシュマップK / Vバッファの多数を使用して)ローカルキャッシュの多数を使用して集中型のキャッシュに。

6.まとめ

これらの二つの展開に導入し、この場合に戻り、5 32ビットJDK論理クラスタの確立のための最終的な展開計画を調整し、各プロセスは2GBのRAMによって計算される、メモリの10ギガバイトを占有します。また、プロキシアクセスポータルイコライザーのフロントエンドとしてApacheサービスの確立。ガベージコレクションの低い利用者の要求に応じ、そのCMSコレクタを考えます。展開が完了すると、サービスはその後、長い休止現象をそこに持って、スピードのアップグレードは、以前のハードウェアのアップグレード以上のものを持っています。

三、日食の同調速度

Eclipseの同調速度

IVの概要

チューニングは、実際にライブ「クーリー」ですが、人材要件の品質があるため、このようなA長いリードタイムチューニングと経験の不足のため、上記の経験上記のように、比較的高いです。もちろん、嵐の後の日、生き残る、と本当に多くのことを改善し、多くのコードを記述するだけでなく、より大きな絵を強化します。だから、チューン、このことは、良い面接の質問、個人の能力の最良の指標です。

 

謝辞:著者周志明による技術サポートに感謝!

公開された110元の記事 ウォンの賞賛9 ビュー6955

おすすめ

転載: blog.csdn.net/guorui_java/article/details/104026992