6

Java VisualVm(バージョン1.7.0 b110325)でCPUプロファイルされているクラスをフィルタリングしたいと思います。このために、[プロファイラー]->[設定]->[CPU-設定]で、テスト対象のパッケージに[プロファイルのみのクラス]を設定しようとしましたが、効果はありませんでした。次に、「クラスのプロファイルを作成しない」に設定して、すべてのjava。*クラスとsun。*クラスを削除しようとしましたが、どちらも効果がありませんでした。

これは単なるバグですか?それとも私は何かが足りないのですか?回避策はありますか?私は以外を意味します:

これは主に、メソッドごとに消費されたCPUの半分の正しいパーセンテージを取得するために実行したいと思います。このために、私は厄介な測定値を取り除く必要があります、例えばsun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run()(約70%)。多くのユーザーがこの問題を抱えているようです。

4

2 に答える 2

10

プロファイルに表示される理由は、[プロファイルの新しいランナブルsun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run()]オプションを選択したままにしたためです。

また、プロファイリングセッションのスナップショットを撮った場合は、任意のホットスポットメソッドのコールスタック全体を確認できます。このようにして、run()メソッドから独自のアプリケーションロジックメソッドに移動し、新しいプロファイルによって生成されたノイズを除外できます。 Runnablesオプション。

于 2011-08-27T05:40:50.347 に答える
0

OK、あなたの目標はコードをできるだけ速く実行することなので、その方法を提案させてください。私はVisualVMの専門家ではありませんが、何が機能するかをお話しすることができます。(実際に知っておくべきことを教えてくれるプロファイラーはごくわずかです。つまり、コードのどの行が実時間のかなりの部分でスタックにあるかを教えてくれます。)

私が今まで気にした唯一の測定は、全体の時間のストップウォッチです。あるいは、コードにフレームレートのようなものがある場合は、1秒あたりのフレーム数です。それを見つけるための非常に直接的な方法がある場合、それはせいぜい時間を浪費している(そしてより多くの場合完全に無関係である)ものへの遠い手がかりであるため、私はそれ以上の精度の内訳を必要としません。

ランダムな一時停止をしたくない場合、それはあなた次第ですが、それは機能することが証明されています。これが43倍の高速化の例です

基本的に、アイデアは、ランダムな壁掛け時計の時間に取得された(10のような少数の)スタックサンプルを取得することです。各サンプルは、(明らかに)呼び出しサイトのリストで構成され、場合によっては最後に非呼び出しサイトで構成されます。(サンプルがI / O中またはスリープ中の場合、システムコールで終了しますが、これは問題ありません。それが知りたいことです。)

コードを高速化する方法がある場合(そしてほぼ確実にあります)、スタックサンプルの少なくとも1つに表示されるコード行として表示されます。1つのサンプルに表示される確率は、使用する時間の割合とまったく同じです。 したがって、正常な時間の割合を使用する呼び出しサイトまたは他のコード行があり、それを実行することを回避できる場合、全体の時間はその割合だけ減少します。

すべてのプロファイラーを知っているわけではありませんが、それがズームであることがわかります。他の人はそれを行うことができるかもしれません。それらはより巧妙かもしれませんが、あなたの目的がパフォーマンスを最大化することである場合、それらは手動の方法よりも速くまたはより良く機能しません。

于 2011-08-26T22:58:25.763 に答える