web-dev-qa-db-ja.com

コマンドラインで実行中のJavaアプリケーションをプロファイリングする

私はJavaアプリケーションをVisualVMで頻繁に実行していますが、マシンで実行するにはXが必要です。

管理ポート経由で接続できることは知っていますが、それはオフラインのサンプリングされたプロファイリングであり、私には十分ではありません。

だから、コマンドラインから実行中のJavaアプリケーションのメソッドのCPU使用率をプロファイルできるソリューションを探しています。サーバーでデータを収集し、収集されたデータは別のマシンで分析できます。

更新:

もっと具体的にする必要があるようです。実行中のJavaコマンドラインからアプリケーションをプロファイリングしたいので、停止して再実行したくありません。

52
KARASZI István

jvmtop アプリケーションは、コマンドラインからプロファイリングするための便利なツールです。 jvmを停止する必要はありません。使用法:

jvmtop.sh --profile <PID>

アプリの実行中に更新されるこのような出力が得られます:

  Profiling PID 24015: org.Apache.catalina.startup.Bootstrap
  36.16% (    57.57s) hudson.model.AbstractBuild.calcChangeSet()
  30.36% (    48.33s) hudson.scm.SubversionChangeLogParser.parse()
   7.14% (    11.37s) org.kohsuke.stapler.jelly.JellyClassTearOff.parseScript()
  ...

利点は、インストルメンテーションを使用しないことです。プロファイル対象のjvmのクラスは変更されません。

もっと視覚的なものを探しているなら、jvmtopに基づいている jvm-mon を見てください

30
Andrejs

jstackで10または20個のスタックサンプルを収集できますか?次に、Fooがメソッドである場合、全体の時間使用量はそれを含むサンプルの割合です。 CPU使用率は、I/Oまたはシステムコールで終了しないサンプルの割合です。その「自己時間」は、それ自体が終点であるサンプルの割合です。

きれいなものは必要ありません。 IDEの下で実行してそれらをそのように収集するか、jstackのようなものを使用して、実行中のアプリ。

それが ランダムポーズ テクニックです。

14
Mike Dunlavey

Javaアプリをコマンドラインからプロファイリングする「組み込み」の方法は、このようにコマンドラインパラメーターのプロファイリングで起動することです

$ Java -Xrunhprof:cpu=samples,file=myprogram.hprof ...

次に、GUIツール(または jhat )または コマンドなどのWebサーバーツールでファイル「myprogram.hprof」を調べます。プロセスが終了した後、その時点でファイルが作成された後、line tool .

前述の「QUIT」シグナルトリックを使用すると、 https://stackoverflow.com/a/2344436/32453 でファイルを自由に生成できますJVMを終了せずに(以前の出力ファイルに追加するように見えます)。または、プロセスが終了し、ファイルが生成されるまで待ちます。

この(ビルトイン)プロファイラーは、まれにサンプルを実行するため、通常は全体的なスローダウン/影響を低く抑えます。

参照: http://web.archive.org/web/20160623224137/https://thunderguy.com/semicolon/2004/04/18/profiling-a-Java-program-easily /

13
rogerdpack

サーバーで hprof を使用しましたが、本格的なVisualVMセッションを実行できない場合は、sysoutsよりも間違いなく優れています。

Hprofの使用例はたくさんあります。

6

「すでに開始された」JVMをプロファイリングする1つの方法は、時間の経過とともに取得された複数のjstackを集約することです。

たとえば、それらを解析して FlameGraph として表示できます(そのリンクのさまざまな回答の詳細を参照してください。ここでは重複して説明しません)。

2
rogerdpack

ほとんどの商用プロファイラーをリモートで実行できるため、サーバー上でエージェントが実行され、開発マシンのクライアントを介してそのエージェントに接続されます。私の絶対好きなプロファイラーはJProfilerです。購入はかなり合理的で、非常に安定しています(すべての商用プロファイラーがそうであるとは限りません)。

http://www.ej-technologies.com/products/jprofiler/overview.html

安定しているが、私のお気に入りではない他の商用プロファイラーはYourKITです。

http://www.yourkit.com/

これらの小規模ベンダーは優れたツールを作成します。これらのツールは、メソッドのタイミング、メモリ使用量、GCなどに関する大量の情報を提供します。jconsoleをはるかに超えています。

2
chubbsondubs

https://github.com/jvm-profiling-tools/async-profiler を使用すると、最も正確なプロファイリングを実現できます。

このプロジェクトはJavaの低オーバーヘッドサンプリングプロファイラーであり、セーフポイントバイアスの問題はありません。スタックトレースを収集し、メモリ割り当てを追跡するHotSpot固有のAPIを備えています。 Oracle JDKおよびその他のJava HotSpot JVMに基づくランタイム。

コマンドラインからインストールして実行するスクリプトを次に示します。

async-profiler.sh

if [ ! -d profiler ]; then
  mkdir profiler && cd profiler && curl -L https://github.com/jvm-profiling-tools/async-profiler/releases/download/v1.6-ea/async-profiler-1.6-ea-linux-x64.tar.gz | tar xvz
  echo 1 > /proc/sys/kernel/perf_event_paranoid
  echo 0 > /proc/sys/kernel/kptr_restrict
  #apt install openjdk-8-dbg
else
  cd profiler
fi

#jps

./profiler.sh -d 60 -f dump_`date +%Y-%m-%d_%H-%M-%S`.jfr `jps -q`

アプリは同じユーザーで実行され、jpsによってリストされる単一のJavaプロセスPIDが存在することを前提としています。プロファイリング期間は60秒です。アプリの起動オプションやアプリの再起動は必要ありません。

ダンプを調べるためのGUIはIntelliJに組み込まれていますIDEA Ultimate: https://www.jetbrains.com/help/idea/cpu-profiler.html

1
Vadzim