JProfiler帮助文档

用于分析的命令行可执行文件

JProfiler 包含许多命令行工具,用于设置 profiling agent 以及从命令行控制分析操作。

将 profiling agent 加载到正在运行的 JVM 中

使用命令行实用程序 bin/jpenable,您可以将 profiling agent 加载到版本为 8 或更高版本的任意正在运行的 JVM 中。借助命令行参数,您可以将该过程自动化,使其无需用户输入。支持的参数包括:

用法:jpenable [选项]

jpenable 在选定的本地 JVM 中启动分析代理,以便您可以从其他计算机连接到它。
如果 JProfiler GUI 在本地运行,您可以直接从 JProfiler GUI 进行 attach,
而无需运行此可执行文件。

* 如果未提供任何参数,jpenable 将尝试发现尚未被分析的本地 JVM,
  并在命令行上请求所有必要的输入。
* 使用以下参数,您可以在命令行上部分或完全提供
  所有用户输入:

  -d  --pid=<PID>     应被分析的 JVM 的 PID
  -n  --noinput       在任何情况下都不请求用户输入
  -h  --help          显示此帮助信息
      --options=<OPT> 传递给代理的调试选项

  GUI 模式:(默认)
  -g  --gui           将使用 JProfiler GUI attach 到 JVM
  -p  --port=<nnnnn>  分析代理应监听来自 JProfiler GUI 连接的端口

  -a  --address=<IP>  分析代理应监听的地址。若不指定
                      此参数,attach 只能从 localhost 进行。
                      使用 0.0.0.0 监听所有地址

  离线模式:
  -o  --offline       JVM 将以离线模式被分析
  -c  --config=<PATH> 包含配置文件设置的配置文件路径
  -i  --id=<ID>       配置文件中 session 的 ID。如果配置文件
                      仅包含单个 session,则不需要此参数。

  无配置文件的离线 session 设置:
    --call-tree-mode=<sampling|instr|async>
        调用树收集模式
    --profile=<LIST>
        被分析的包或类,以 ':' 分隔
    --compact=<LIST>
        紧凑包或类,以 ':' 分隔
    --ignore=<LIST>
        忽略的包或类,以 ':' 分隔
    --line-numbers=<true|false>
        记录行号

  无配置文件的离线自动记录:
    --snapshot=<PATH>
        将自动记录的快照保存到此路径
    --recording=<LIST>
        要记录的数据类型,以 ':' 分隔。线程和遥测始终会被记录。
        默认为 cpu。可选值:
        cpu, allocation, jdbc, jpa, mongo_db, cassandra, http_server, http_client, jndi, jms
        kafka_producer, kafka_consumer, rmi, grpc, ai, ws, class_loader, exception, socket, file
        process, gc.
    --duration=<TIME>
        记录持续时间,例如 30s、10m 或 1h。若不指定此选项,
        记录将持续到 JVM 终止为止。
    --delay=<TIME>
        记录开始前的延迟时间,例如 10s 或 1m。

请注意,JVM 必须与 jpenable 以相同的用户身份运行,否则
JProfiler 将无法连接到它。
一个例外是 Windows 服务将运行在本地系统账号下,如果你
与 jpenable 交互的方式列出它们。

保存 HPROF 快照

如果您只需要堆快照,可以考虑使用 bin/jpdump 命令行工具,它可以在不将 profiling agent 加载到 VM 中的情况下保存 HPROF 快照:

用法: jpdump [options]

jpdump 将一个本地运行JVM中的堆,转储到一个文件。
Hotspot 虚拟机生成HPROF文件, OpenJ9 虚拟机生成PHD文件。
然后HPROF 和 PHD 文件可以在JProfiler GUI中打开。

* 如果没有提供参数,jpdump 将列出所有本地运行的 JVM。
* 你可以提供以下部分或全部参数
  用户在命令行输入:

  -p  --pid=<PID>    指定要做堆转储的 JVM
                     的 PID, 不会再被问及其他问题
  -a  --all          保存所有对象。如果未指定,则只有活性对象会被
                     转储
  -f  --file=<PATH>  转储文件路径。如果未指定,转储文件
                     <VM name>.hprof 会被写到当前路径下。
                     如果文件已经存在,会追加一个数字。
  -h  --help         显示该帮助信息

注意,运行JVM的用户必须和运行jpdump的用户相同,否则
JProfiler 无法连接JVM。
一个例外是 Windows 服务将运行在本地系统账号下,如果你
与 jpdump 交互的方式列出它们。

与加载 profiling agent 并保存 JProfiler 堆快照相比,这样产生的开销更低。此外,由于 profiling agent 无法被卸载,此方法适用于在生产环境中运行的 JVM。

控制 profiling agent

当您在不带参数的情况下启动 bin/jpcontroller 可执行文件时,它会尝试连接到本地计算机上被分析 (profiled) 的 JVM。如果发现了多个被分析 (profiled) 的 JVM,您可以从列表中选择一个。

jpcontroller 只能连接到已设置配置文件设置 (profiling setting) 的 JVM,因此如果 JVM 是在 -agentpath VM 参数中带有 "nowait" 选项启动的,它将无法工作。当在集成向导的“Startup mode”屏幕上选择 Startup immediately, connect later with the JProfiler GUI 单选按钮且尚无 JProfiler GUI 连接到 agent 时,就会设置该选项。在不带 --offline 参数的情况下使用 jpenable 时,同样需要先从 JProfiler GUI 进行连接,然后 jpcontroller 才能连接到被分析 (profiled) 的进程。

如果您想连接到远程计算机上的进程,或者 JVM 不是版本为 8 或更高版本的 HotSpot JVM,则必须向被分析 (profiled) 的 JVM 传递 VM 参数 -Djprofiler.jmxServerPort=[port]。该端口上将发布一个 MBean 服务器,您可以将所选端口作为参数指定给 jpcontroller。通过附加的 VM 参数 -Djprofiler.jmxPasswordFile=[file],您可以指定一个包含形如 user password 的键值对的属性文件来设置身份验证(用空格或制表符分隔)。请注意,这些 VM 参数会被 com.sun.management.jmxremote.port VM 参数覆盖。

显式设置 JMX 服务器后,您可以通过调用 jpcontroller host:port 使用命令行控制器连接到远程服务器。如果远程计算机只能通过 IP 地址访问,则必须向远程 VM 添加 -Djava.rmi.server.hostname=[IP address] 作为 VM 参数。

默认情况下, jpcontroller 是一个交互式命令行实用程序,但您也可以使用它来自动化分析会话 (session),而无需手动输入。自动化调用将传递 [pid | host:port] 以选择被分析 (profiled) 的 JVM,以及 --non-interactive 参数。此外,还会读取命令列表,可以从 stdin 读取,也可以从通过 --command-file 参数指定的命令文件中读取。每个命令从新的一行开始,空白行或以 "#" 注释字符开头的行将被忽略。

这种非交互模式的命令与 JProfiler MBean 中的方法名称相同。它们需要相同数量的参数,并以空格分隔。如果字符串包含空格,则必须用双引号括起来。此外,还提供了一个 sleep <seconds> 命令,用于暂停若干秒。这样您就可以开始记录,等待一段时间,然后将快照保存到磁盘。

请注意,必须在 profiling agent 中设置配置文件设置 (profiling setting)。这会在您使用 JProfiler UI 连接时进行设置。如果您从未使用 JProfiler UI 连接,则必须在启动命令中或使用 jpenable 手动进行设置,有关更多信息,请参见关于在启动时设置配置文件设置的帮助主题。

下面显示了 jpcontroller 支持的参数:

用法: jpcontroller [options] [host:port | pid]

* 如果没有提供任何参数, jpcontroller 将尝试发现
   正在被分析的本地 JVM
* 如果指定了一个数字, 则 jpcontroller 将尝试连接到
   进程 ID 为 [pid] 的 JVM。 如果该 JVM 未被分析, jpcontroller 将无法
   连接。 在这种情况下, 首先使用 jpenable 实用程序。
* 除此之外, jpcontroller 将连接到 "host:port", port 已经
   在被分析 JVM 的 VM 参数 -Djprofiler.jmxServerPort=[port]
   中指定过。

可以使用以下参数选项(options):
  -n --non-interactive      运行一个从标准输入(stdin)
                            读取命令列表的自动会话
  -f --command-file=<PATH>  从一个文件而不是标准输入(stdin)读取命令, 仅当和
                            --non-interactive 一块使用。

非交互命令的语法:
  请参见 RemoteControllerMBean (https://bit.ly/2DimDN5) 的 javadoc
  操作列表。 各参数以空格分割,如果某个参数含有空格
  必须使用引号引起来。 例如:

    addBookmark "Hello world"
    startCPURecording true
    startProbeRecording builtin.JdbcProbe true true
    sleep 10
    stopCPURecording
    stopProbeRecording builtin.JdbcProbe
    saveSnapshot /path/to/snapshot.jps

  sleep <seconds> 命令暂停指定的秒数。
  空行和以 # 开头的行将被忽略。