JProfiler帮助文档

用于 Profiling 的命令行可执行文件

JProfiler 提供了一些命令行工具,用于设置 profiling agent 并通过命令行控制 profiling 操作。

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

使用命令行工具 bin/jpenable,你可以将 profiling agent 加载到任何版本为 6 或更高的正在运行的 JVM 中。通过命令行参数,你可以自动化该过程,无需人工输入。支持的参数如下:

使用法: jpenable [オプション]

jpenableは選択されたローカルJVMでプロファイリングエージェントを開始し、別のコンピュータから接続
できるようにします。JProfiler GUIがローカルで実行されている場合は、この実行可能ファイルを実行する代わりに
JProfiler GUIから直接アタッチできます。

* 引数が指定されていない場合、jpenableはまだプロファイルされていないローカルJVMを発見しようとし、
  コマンドラインで必要なすべての入力を求めます。
* 次の引数を使用すると、コマンドラインでユーザー入力を部分的または完全に提供できます:

  -d  --pid=<PID>     プロファイルされるべきJVMのPID
  -n  --noinput       いかなる状況でもユーザー入力を求めない
  -h  --help          このヘルプを表示
      --options=<OPT> エージェントに渡されるデバッグオプション

  GUIモード: (デフォルト)
  -g  --gui           JProfiler GUIを使用してJVMにアタッチします
  -p  --port=<nnnnn>  JProfiler GUIからの接続を待ち受けるプロファイリングエージェントのポート
  -a  --address=<IP>  プロファイリングエージェントが待ち受けるアドレス。このパラメータがない場合、
                      localhostからのみアタッチが可能です。
                      すべてのアドレスで待ち受けるには0.0.0.0を使用します

  オフラインモード:
  -o  --offline       JVMはオフラインモードでプロファイルされます
  -c  --config=<PATH> プロファイリング設定を含む設定ファイルへのパス
  -i  --id=<ID>       設定ファイル内のセッションID。設定ファイルが単一のセッションのみを保持している場合は不要です。

JVMはjpenableと同じユーザーとして実行されている必要があることに注意してください。そうでないと、
JProfilerは接続できません。
一个例外是 Windows 服务将运行在本地系统账号下,如果你
与 jpenable 交互的方式列出它们。

保存 HPROF 快照

如果你只需要一个 heap 快照,可以考虑使用 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 heap 快照要低。此外,由于 profiling agent 无法被卸载,该方法适用于在生产环境中运行的 JVM。

控制 profiling agent

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

jpcontroller 只能连接已设置 profiling_setting 的 JVM,因此如果 JVM 是通过 -agentpath VM 参数的 "nowait" 选项启动的,则无法使用。该选项会在集成向导的 "Startup mode" 界面选择 立即启动,稍后通过 JProfiler GUI 连接 单选按钮且尚未有 JProfiler GUI 连接到 agent 时被设置。使用 jpenable 且未带 --offline 参数时,也需要 JProfiler GUI 先连接, jpcontroller 才能连接到被分析进程。

如果你想连接远程计算机上的进程,或者该 JVM 不是版本为 6 或更高的 HotSpot JVM,你需要为被分析(profiled)JVM 添加 VM 参数 -Djprofiler.jmxServerPort=[port]。MBean server 会在该端口上发布,你可以将选择的端口作为参数传递给 jpcontroller。通过额外的 VM 参数 -Djprofiler.jmxPasswordFile=[file],你可以指定一个包含 user password 形式的键值对(用空格或 Tab 分隔)的 properties 文件来设置认证。请注意,这些 VM 参数会被 com.sun.management.jmxremote.port VM 参数覆盖。

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

默认情况下, jpcontroller 是一个交互式命令行工具,但你也可以用它自动化 profiling session,无需人工输入。自动化调用时需要传递 [pid | host:port] 以选择被分析(profiled)JVM,并加上 --non-interactive 参数。此外,命令列表会被读取,可以来自 stdin,也可以通过 --command-file 参数指定命令文件。每条命令单独占一行,空行或以 "#" 注释符号开头的行会被忽略。

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

请注意,profiling_setting 必须在 profiling agent 中设置。这通常在你用 JProfiler UI 连接时完成。如果你从未用 JProfiler UI 连接,则需要在启动命令或通过 jpenable 手动设置。更多信息请参见 关于启动时设置 profiling_setting 的帮助主题

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> 命令暂停指定的秒数。
  空行和以 # 开头的行将被忽略。