26

Java コードの特定のセグメントについて、以下を測定したいと思います。

  • 実行時間 (おそらくスレッド実行時間)
  • メモリ使用量
  • CPU 負荷 (特にコード セグメントに起因する)

私は比較的 Ja​​va の初心者であり、これがどのように達成されるかについてよく知りません。私はJMXに言及されましたが、それがどのように使用されるかはわかりません.JMXは、私がやろうとしていることに対して少し「重い」ように見えます.

start()理想的には、コード セグメントの前にメソッドを呼び出し、後でメソッドを呼び出すオプションを使用して、何を測定したいかを伝えることができる測定クラスが必要stop()です。関連するメトリックは、指定したファイルに記録されます。

例えば:

import com.example.metricLogger;

metricLogger logger = new metricLogger();

logger.setLogPath(pathToLogFile);
logger.monitor(executionTime);
logger.monitor(memoryUsage);
logger.monitor(cpuLoad);

logger.start();

/* Code to be measured */

logger.stop();

Javaでこれを達成する標準/一般/従来の方法はありますか?

このような測定は 1 回限りのパフォーマンス比較のためのものであるため、本番環境での長期的な監視プロセスを探しているわけではありません。

チュートリアルや外部の例を参照できることを嬉しく思いますが、ここで完全な回答を期待することはできません。とはいえ、上記のような単純なものを実現できれば、現実的な例はうまくいくでしょう。

4

4 に答える 4

19

プロファイリングは、本番環境の統計を必要としないため、より簡単なオプションになる場合があります。プロファイリングには、コードの変更も必要ありません。VisualVM (JDK 1.6.06+ に付属) はシンプルなツールです。より詳細な情報が必要な場合は、Eclipse TPTP、Netbeans プロファイラー、または JProfiler(有料) を使用します。

自分で書きたい場合は、次のことを考慮してください。

実行時間などの単純な測定は、関心のあるセクションを「クロック」することで実行できます。

long start = System.nanoTime(); // requires java 1.5
// Segment to monitor
double elapsedTimeInSec = (System.nanoTime() - start) * 1.0e-9;

同様の手法を使用して、Runtime.getRuntime().*memory() メソッドを介してメモリを監視できます。ガベージ コレクション環境でのメモリ使用量の追跡は、単純な減算よりも注意が必要です。

Java で CPU 負荷を測定するのは困難です。私は通常、実行時間に固執し、より長い/反復的なセクションを最適化します

于 2008-11-19T14:44:12.843 に答える
5

ThreadMXBean を使用すると、経過時間ではなく、個々のスレッドの CPU 使用率と消費された CPU 時間を取得できます。

ただし、このプロセスでは多くのデータが生成されることが多く、何が起こっているかを確認するには優れた視覚化ツールが必要なため、プロファイラーを使用する方が簡単な場合がよくあります。

私が使用した他のプロファイラーよりも簡単に問題を解決できるように、Yourkit を使用しています。また、組み込みの hprof を使用すると、アプリケーションのプロファイルを別のビューで表示できるようになります (ただし、それほど有用ではありません)。

于 2009-01-24T07:40:04.617 に答える
1

Javaプロファイラーを使用するのが最良のオプションであり、コードに必要なすべての洞察が得られます。つまり、応答時間、スレッドCallTraces、メモリ使用率など

使いやすさとCPUのオーバーヘッドが少ないことから、オープンソースのJavaプロファイラーであるJENSORをお勧めします。ダウンロードしてコードをインストルメント化すると、コードについて必要なすべての情報を取得できます。

次のサイトからダウンロードできます:http://jensor.sourceforge.net /

于 2008-11-19T15:16:52.123 に答える