質問

Javaコードの特定のセグメントについて、測定したい:

  • 実行時間(ほとんどの場合、スレッド実行時間
  • メモリ使用量
  • CPU負荷(具体的にはコードセグメントに起因)

私は相対的なJava初心者であり、これがどのように達成されるかについて詳しくはありません。 JMX に紹介されましたが、どのように使用されるかはわかりませんが、そして、JMXは私がやろうとしていることに対して少し「重い」ように見えます。

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

例:

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回限りのパフォーマンス比較のためのものであるため、本番環境での長期監視プロセスは探していません。

チュートリアルや外部の例を参照できてうれしいです。ここで完全な答えを期待しないでください。とはいえ、上記のような単純なものを実現できる場合、現実的な例は非常にうまくいきます。

役に立ちましたか?

解決

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

自分で書きたい場合は、以下を考慮してください:

実行時間などの単純な測定は、「クロッキング」によって実行できます。興味のあるセクション:

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

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

JavaでCPU負荷を測定することは困難です。通常、実行時間を厳守し、より長い/繰り返しのセクションを最適化します

他のヒント

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

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

Yourkitを使用するのは、他のプロファイラーが使用した問題を簡単に解決できるためです。 また、ビルトインhprofを使用します。これにより、アプリケーションのプロファイルについて異なるビューが得られる可能性があります(ただし有用ではありません)

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

JENSOR は、オープンソースのJavaプロファイラーであり、 CPUの使いやすさと低オーバーヘッド。ダウンロードしてコードをインストルメントすれば、コードについて必要な情報をすべて入手できます。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top