私はJavaアプリケーションをVisualVMで頻繁に実行していますが、マシンで実行するにはXが必要です。
管理ポート経由で接続できることは知っていますが、それはオフラインのサンプリングされたプロファイリングであり、私には十分ではありません。
だから、コマンドラインから実行中のJavaアプリケーションのメソッドのCPU使用率をプロファイルできるソリューションを探しています。サーバーでデータを収集し、収集されたデータは別のマシンで分析できます。
更新:
もっと具体的にする必要があるようです。実行中のJavaコマンドラインからアプリケーションをプロファイリングしたいので、停止して再実行したくありません。
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 を見てください
jstackで10または20個のスタックサンプルを収集できますか?次に、Fooがメソッドである場合、全体の時間使用量はそれを含むサンプルの割合です。 CPU使用率は、I/Oまたはシステムコールで終了しないサンプルの割合です。その「自己時間」は、それ自体が終点であるサンプルの割合です。
きれいなものは必要ありません。 IDEの下で実行してそれらをそのように収集するか、jstackのようなものを使用して、実行中のアプリ。
それが ランダムポーズ テクニックです。
Javaアプリをコマンドラインからプロファイリングする「組み込み」の方法は、このようにコマンドラインパラメーターのプロファイリングで起動することです
$ Java -Xrunhprof:cpu=samples,file=myprogram.hprof ...
次に、GUIツール(または jhat )または コマンドなどのWebサーバーツールでファイル「myprogram.hprof」を調べます。プロセスが終了した後、その時点でファイルが作成された後、line tool .
前述の「QUIT」シグナルトリックを使用すると、 https://stackoverflow.com/a/2344436/32453 でファイルを自由に生成できますJVMを終了せずに(以前の出力ファイルに追加するように見えます)。または、プロセスが終了し、ファイルが生成されるまで待ちます。
この(ビルトイン)プロファイラーは、まれにサンプルを実行するため、通常は全体的なスローダウン/影響を低く抑えます。
サーバーで hprof を使用しましたが、本格的なVisualVMセッションを実行できない場合は、sysoutsよりも間違いなく優れています。
Hprofの使用例はたくさんあります。
「すでに開始された」JVMをプロファイリングする1つの方法は、時間の経過とともに取得された複数のjstackを集約することです。
たとえば、それらを解析して FlameGraph として表示できます(そのリンクのさまざまな回答の詳細を参照してください。ここでは重複して説明しません)。
ほとんどの商用プロファイラーをリモートで実行できるため、サーバー上でエージェントが実行され、開発マシンのクライアントを介してそのエージェントに接続されます。私の絶対好きなプロファイラーはJProfilerです。購入はかなり合理的で、非常に安定しています(すべての商用プロファイラーがそうであるとは限りません)。
http://www.ej-technologies.com/products/jprofiler/overview.html
安定しているが、私のお気に入りではない他の商用プロファイラーはYourKITです。
これらの小規模ベンダーは優れたツールを作成します。これらのツールは、メソッドのタイミング、メモリ使用量、GCなどに関する大量の情報を提供します。jconsoleをはるかに超えています。
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 。