33

jdiインターフェイスを使用してデバッガーを作成しています。MethodEntryRequestsを使用してメソッドエントリのトレースを有効にすると、デバッグされたプログラムの速度が数十倍遅くなります。メインスレッドのフィルターを設定し、ポリシーをSUSPEND_EVENT_THREADに一時停止しました。Classfilterには制限があり、受信したイベントを印刷しても、数十個しか表示されないため、あまり多くのイベントを受信しないようにする必要があります。私はローカルでデバッグしていて、デバッグされたJavaプログラムで次のようなコマンドラインを使用しています。

-Xdebug -Xrunjdwp:transport=dt_socket,suspend=y,server=y,address=1337

4

3 に答える 3

31

簡単に言うと、メソッド エントリが設定されている場合、実行はインタープリターを介して実行されます。この辺りは仕方ないと思いますが…

これは、以前はデバッグ モードで実行されているすべてのコードに当てはまりましたが、1.4 で拡張されました。現在、HotSpot は、メソッドのエントリと終了、ウォッチポイントの場合、およびシングル ステップまたはメソッド内の場合を除いて、「フルスピード」のデバッグで機能します。ブレークポイントが含まれています。

于 2009-04-24T22:08:04.567 に答える
11

2 つの理由:

  1. すべてのメソッド エントリにチェックを追加する必要があります (一部のメソッドだけを微調整するオプションはありません)。
  2. メソッドのインライン展開が不可能になる (小さなメソッドの実行速度が 10 ~ 100 倍遅くなる)

同じことがプロファイラーと .net アプリにも当てはまります

于 2009-04-26T12:36:19.557 に答える
5

ブレークするために選択されたものと一致するかどうかを確認するために、メソッド呼び出しごとにデバッガーを起動する必要があると思います。実行する前にすべてのメソッド呼び出しをチェックして潜在的な一致を確認する必要があるため、これらすべてのチェックを行う必要がない場合よりもかなり遅くなります。

于 2009-04-21T03:26:38.887 に答える