Javaプロファイラの手引き

1概要

  • メモリの割り当て方法、あるコーディングアプローチを別のコーディングアプローチを使用した場合の影響、同時実行の影響、パフォーマンス向上のための領域など、内部で何が行われているのかを知りたい場合があります。これにはプロファイラを使用できます。

Javaプロファイラは、Javaバイトコードの構成と操作をJVMレベルで監視するツールです。これらのコード構成および操作には、オブジェクト作成、反復実行(再帰呼び出しを含む)、メソッド実行、スレッド実行、およびガベージコレクションが含まれます。

この記事では、主なJavaプロファイラーについて説明します。

JProfiler 、https://www.yourkit.com/java/profiler/[YourKit]、https://visualvm.github.io/[Java VisualVM]、およびhttps://profiler.netbeans.org[Netbeansプロファイラ]。

2 JProfiler

JProfilerは多くの開発者にとって最高の選択肢です。直感的なUIを使って、JProfilerはシステムパフォーマンス、メモリ使用量、潜在的なメモリリーク、そしてスレッドプロファイリングを見るためのインターフェースを提供します。

この情報を基にして、基盤となるシステムで最適化、削除、または変更が必要なものを簡単に知ることができます。

JProfilerのインターフェースは次のようになります。

リンク:/uploads/1-jprofiler-overview-probing.png[機能を備えたJProfiler概要インターフェース]

ほとんどのプロファイラーと同様に、このツールはローカルとリモートの両方のアプリケーションに使用できます。これは、リモートマシン上で実行されているJavaアプリケーションを、何もインストールしなくてもプロファイルできることを意味します。

JProfilerはまたSQLとNoSQLデータベースの両方のための高度なプロファイリングを提供します。 JDBC、JPA/Hibernate、MongoDB、Casandra、およびHBaseデータベースのプロファイリングに対する特別なサポートを提供します。

以下のスクリーンショットは、現在の接続のリストを含むJDBCプローブインタフェースを示しています。

データベースとの対話の呼び出しツリーについて学び、リークされている可能性のある接続を確認したい場合、JProfilerはこれをうまく処理します。

Live MemoryはJProfilerの1つの機能であり、これにより アプリケーションによる現在のメモリ使用量を確認することができます 。オブジェクトの宣言とインスタンス、またはフルコールツリーのメモリ使用量を確認できます。

アロケーションコールツリーの場合、ライブオブジェクト、ガベージコレクションオブジェクト、またはその両方のコールツリーを表示することを選択できます。このアロケーションツリーが特定のクラスまたはパッケージのためのものか、すべてのクラスのためのものかを決定することもできます。

以下の画面は、インスタンス数を持つすべてのオブジェクトによるライブメモリ使用量を示しています。

リンク:/uploads/3-jprofiler-live-memory.png[JProfilerライブメモリビュー]

JProfilerは、Eclipse、NetBeans、IntelliJなどの一般的なIDEとの統合をサポートしています。スナップショットからソースコードへの移動も可能です。

3 YourKit

YourKit Javaプロファイラは、さまざまなプラットフォーム上で動作し、サポートされているオペレーティングシステム(Windows、MacOS、Linux、Solaris、FreeBSDなど)ごとに個別のインストールを提供します。

JProfilerのように、YourKitはスレッド、ガベージコレクション、メモリ使用量、メモリリークを視覚化するためのコア機能を持ち、 sshトンネリングによるローカルおよびリモートプロファイリング をサポートします。

これがTomcatサーバーアプリケーションのメモリプロファイリング結果の簡単なまとめです。

YourKitは例外をスローするようにプロファイルしたい場合にも便利です。どの種類の例外がスローされたか、および各例外が発生した回数を簡単に確認できます。

YourKitには、スレッド内のメソッドやサブツリーなど、コードの特定の領域に焦点を絞ったプロファイリングを可能にする興味深い** CPUプロファイリング機能があります。 what-if機能による条件付きプロファイリングが可能になるため、これは非常に強力です。

図5は、スレッドプロファイリングインタフェースの例を示しています。

YourKitを使って SQLおよびNoSQLデータベース呼び出し をプロファイルすることもできます。実行された実際のクエリに対するビューも提供します。

これは技術的な考慮事項ではありませんが、YourKitの寛容なライセンスモデルは、シングルユーザーライセンスの購入だけでなく、マルチユーザーまたは分散チームにも適しています。

4 Java VisualVM

Java VisualVMは、Javaアプリケーション用の単純化された堅牢なプロファイリングツールです。デフォルトでは、このツールはJava Development Kit(JDK)にバンドルされています。その操作は、JDKで提供されている他のスタンドアロンツール( JConsole jstat jstack jinfo jmap など)に依存しています。

以下に、Java VisualVMを使用した進行中のプロファイリングセッションの簡単な概要インタフェースを示します。

Java VisualVMの興味深い利点の1つは、プラグインとして新しい機能を開発するために** 拡張できることです。その後、これらのプラグインをJava VisualVMの内蔵アップデートセンターに追加します。

Java VisualVMは、 ローカルおよびリモートプロファイリング 、ならびにメモリおよびCPUプロファイリングをサポートしています。 リモートアプリケーションに接続するには、資格情報(必要に応じてホスト名/IPとパスワード)を提供する必要があります。 sshトンネリングのサポートは提供していません 。また、 インスタントアップデートによるリアルタイムプロファイリング** (通常は2秒ごと)を有効にすることもできます。

以下に、Java VisualVMを使ってプロファイリングされたJavaアプリケーションのメモリ外観を見ることができます。

Java VisualVMのスナップショット機能を使用すると、後で分析するためにプロファイリングセッションのスナップショットを取得できます。

5 NetBeansプロファイラ

NetBeansプロファイラは、 オラクルのオープンソースNetBeans IDE にバンドルされています。

このプロファイラーはJava VisualVMと多くの類似点を共有していますが、すべてを1つのプログラムでラップしたい場合には良い選択です(IDEプロファイラー)。

上記の他のすべてのプロファイラーは、IDEの統合を強化するためのプラグインを提供しています。

以下のスクリーンショットは、NetBeans Profilerインタフェースの例を示しています。

Netbeansプロファイラは、軽量開発とプロファイリングにも適しています。 NetBeans Profilerは、プロファイリングセッションを構成および制御し、結果を表示するための単一のウィンドウを提供します。これは、ガベージコレクションが発生する頻度を知るという独自の機能を提供します。

6. その他のソリッドプロファイラー

ここでいくつかの名誉ある言及はhttp://www.oracle.com/technetwork/java/javaseproducts/mission-control/java-mission-control-1998576.html[ジャバミッションコントロール]、https://newrelic.com/[新しい]([Relic]、およびhttps://stackify.com/prefix/[Prefix](https://stackify.com[Stackify]から) - これらは全体的に市場シェアが少ないですが、間違いなく言及に値するでしょう。たとえば、StackifyのPrefixは優れた軽量プロファイリングツールで、Javaアプリケーションだけでなく他のWebアプリケーションのプロファイリングにも適しています。

7. 結論

この記事では、プロファイリングとJavaプロファイラーについて説明しました。各プロファイラーの機能と、それが他のプロファイラーと比較してどれが選択される可能性があるのか​​を調べました。

利用可能な多くのJavaプロファイラーがあり、そのうちのいくつかには独特の特性があります。この記事で見たように、どのJavaプロファイラーを使用するかの選択は、開発者が選択したツール、必要な分析のレベル、およびプロファイラーの機能によって大きく異なります。