簡體   English   中英

在命令行中分析正在運行的 Java 應用程序

[英]Profiling a running Java application in command line

我經常使用 VisualVM 分析運行 Java 應用程序,但它需要 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

看起來從命令行分析 Java 應用程序的“內置”方法是使用分析命令行參數啟動它,就像這樣

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

然后在進程退出后,使用一些 GUI 工具(或 web 服務器工具,如jhat )或命令行工具檢查文件“myprogram.hprof”(此時文件已創建)。

如果您使用https://stackoverflow.com/a/2344436/32453提到的“QUIT”信號技巧,那么您可以隨意生成一個文件而無需退出 JVM(它似乎附加到先前的輸出文件)。 或者等到進程退出,它會生成文件。

這個(內置的)分析器很少做一個樣本,所以總體上通常會降低速度/影響。

參考: http ://web.archive.org/web/20160623224137/https: //thunderguy.com/semicolon/2004/04/18/profiling-a-java-program-easily/

您也可以通過收集大量 jstack 並將它們轉儲到 ex:火焰圖或其他一些分析器/聚合器中來做“窮人的分析器”...

你能用jstack收集 10 或 20 個堆棧樣本嗎? 那么如果Foo是一個方法,它的總時間使用是包含它的樣本的比例。 它的 CPU 使用率是那些不以 I/O 或系統調用終止的樣本的比例。 它的“自身時間”是樣本的一部分,它本身就是終點。

我不需要漂亮的東西。 我要么在 IDE 下運行它並以這種方式收集它們,要么使用像jstack這樣的東西來對正在運行的應用程序的堆棧進行快照。

這就是隨機暫停技術。

我們在我們的服務器上使用了hprof ,它絕對比 sysouts 更好,以防您無法運行完整的 VisualVM 會話。

使用 hprof 的例子很多:

使用https://github.com/jvm-profiling-tools/async-profiler可以實現最精確的分析。

這個項目是一個低開銷的 Java 采樣分析器,不受安全點偏差問題的影響。 它具有特定於 HotSpot 的 API 來收集堆棧跟蹤和跟蹤內存分配。 分析器與 OpenJDK、Oracle JDK 和其他基於 HotSpot JVM 的 Java 運行時一起工作。

這是我從命令行安裝和運行它的腳本:

異步分析器.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

分析“已經啟動”的 JVM 的一種方法是聚合多個隨着時間推移獲取的 jstack。

例如,您可以將它們解析並顯示為FlameGraph (請參閱該鏈接的各種答案中的詳細信息,我不會在這里多余地包含它們)。

您可以遠程運行大多數商業分析器,以便在服務器上運行代理,然后通過開發機器上的客戶端連接到該代理。 我最喜歡的分析器是 JProfiler。 這是相當合理的購買,而且非常穩定(並非所有商業分析器都是如此)。

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

其他穩定但不是我最喜歡的商業分析器是 YourKIT。

http://www.yourkit.com/

那些較小的供應商提供了很好的工具。 這些工具將為您提供大量有關方法計時、內存使用、GC 等的信息。遠不止 jconsole。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM