3

レストレットを開始するアプリケーションをテストしています。httpリクエストがレストレットに到着し、新しいスレッドを開始してリクエストを処理すると、アプリは新しいオブジェクトを作成してマップに保存します(ストレステストでは、Jmeterを使用しています、Javaプロセスメモリに問題があります。問題がヒープなのか、スタックなのか、それとも他の問題なのかわかりません。問題を表示しましょう。

同じケースを数回起動し、最初にプロジェクトを実行します(もちろん空のキャッシュを使用)。

  1. 500スレッド->スレッドの時間平均は1900ミリ秒です
  2. 500スレッド->スレッドの時間平均は600ミリ秒です
  3. 500スレッド->スレッドの時間平均は598ミリ秒です
  4. 500スレッド->スレッドの時間平均は670ミリ秒です...。

ご覧のとおり、私の問題は、最初の実行に他の実行よりもはるかに時間がかかることです。各スレッドはインスタンス化オブジェクトをマップに格納し、空の場合は動作が非常に遅いようです。誰が行くのか誰か知っていますか?jvmのヒープ開始メモリを増やしようとしましたが、機能しません。また、誰かが私がそれを理解するのを助けるために読むことができる参照を知っているなら

ありがとう。

4

2 に答える 2

3

最初の実行時にJVMがウォームアップしなかったと思われます。追加-XX:+PrintCompilationしてみて、コードが最初のテストでコンパイルされているかどうかを確認しますが、2番目のテストではコンパイルされていません。

于 2012-05-31T16:16:57.353 に答える
1

Javaアプリケーションのパフォーマンスをテストするときは、JVMが「ウォームアップ」する時間を常に確保する必要があります。これは、最新のJVM(コードの実行中にOracleのHotSpot JVMなど)が最適化されているためです。

意味のある結果を得るには、特定の構成/負荷の結果を取得する前に、安定するまでの時間に十分なテストケースを実行する必要があります。

見る:

http://stuq.nl/weblog/2009-01-28/why-many-java-performance-tests-are-wrong

http://buytaert.net/files/oopsla07-georges.pdf

于 2012-05-31T16:28:35.027 に答える