9

VisualVMアプリケーションが遅い場所を確認するために使用しています。ただし、すべてのメソッドが表示されるわけではありません。おそらく、アプリケーションを遅らせるすべてのメソッドが表示されるわけではありません。

私はリアルタイム アプリケーション (サウンド処理) を使用しており、数百マイクロ秒の時間不足があります。

VisualVMそれ自体が高速なメソッドを隠すことは可能ですか?

更新 1

サンプラーと推測で遅い方法を見つけました。toString()オフにしたデバッグロギングから呼び出されたメソッドでしたが、時間がかかりました。

Settings助けになり、今ではそれを見る方法がわかりました。それはStart profiling fromオプションに依存していました。

4

3 に答える 3

15

Ryan Stewart が言及したフィルター以外に、メソッドがプロファイラーに表示されない理由がいくつかあります。

  • サンプリング プロファイルは本質的に確率的です。すべてのスレッドの現在のスタックのサンプルは、N ミリ秒ごとに取得されます。実際には実行されたが、実行中にどのサンプルにも捕捉されなかったいくつかのメソッドは表示されません。どのサンプルにも表示されなかったという事実自体が、実行時間の大部分を占めていないメソッドである可能性が非常に高いことを意味するため、これは一般的にそれほど問題ではありません。
  • visualvm でインストルメンテーション ベースのサンプリング (「CPU プロファイリング」と呼ばれる) を使用する場合、プロファイリングされたメソッドのエントリ ポイントを定義する必要があります (「プロファイリングを開始する」オプション)。デフォルト パッケージのメソッドではこれが失敗することがわかりました。また、プロファイラーがアタッチされているときに現在実行されているメソッドの時間を取得できません (現在の呼び出しの期間中 - 後の呼び出しが取得されます。これはおそらく次の理由によるものです)。インストルメント化されたメソッドは、現在の呼び出しが終了するまでスワップインされません。
  • サンプリングは、コード内の安全なポイントでのみサンプルが取得されるという、スタック トレース ベースのプロファイリングで深刻な問題が発生する可能性があります。トレースが要求されると、各スレッドは強制的にセーフ ポイントに到達し、スタックが取得されます。場合によっては、コード内にセーフ ポイント ポーリングを行わないホット スポットがあり (JIT が一定回数の反復後に終了することを保証できる単純なループでよくある)、セーフ ポイント ポーリングを持つコードの一部がインターリーブされていることがあります。スタックは常にセーフ ポイント コードでプロセスを表示し、セーフ ポイント フリー コードでは決してプロセスを表示しません。後者が CPU 時間の大部分を占めている可能性があります。
于 2012-12-24T21:12:10.013 に答える
6

現時点では手元にありませんが、プロファイリングを開始する前に、デフォルトで非表示になっている設定ペインがあり、メソッドをフィルタリングするための正規表現を入力できます。デフォルトでは、多くのコア JDK を除外します。

于 2012-12-24T21:00:27.143 に答える