我正在尝试从 Linux 命令行使用 jpcontroller 来分析 Java 应用程序(在同一机器上运行)并保存快照以供后续在本地计算机上进行分析。但是,我在分析应用程序的标准输出上看到以下错误“必须配置 JProfiler> 分析会话。忽略控制器调用。”
每当我在交互式 jpcontroller 会话中选择分析选项(例如开始记录 CPU 数据)时,都会写入此消息,并且在选择 jpcontroller 选项保存数据时不会写入分析数据文件。
什么可能会阻止探查器捕获指标并保存快照?
详情
- 我正在运行 jprofiler13.0.4
- 已分析的应用程序是使用以下命令启动的:OpenJDK 运行时环境 Temurin-17.0.8.1+1(内部版本 17.0.8.1+1)
- INSTALL4J_JAVA_HOME 环境变量也设置为指向 jdk-17.0.8.1+1-jre
- 我已在正在分析的应用程序上设置了代理路径 VM arg
- 在启动 jpcontroller 并将其附加到应用程序之前,我已经尝试过 nowait 和 wait 选项
以下是正在分析的应用程序的输出示例:
`开始**BLAH**(监视器=,jmx-port=1,jmx-object-port=3 DEBUG=2)
运行时位置是:** BLAH **
JProfiler> 协议版本 65
JProfiler> 检测到 Java 17。
JProfiler> 64 位库
JProfiler> 监听端口:8849。
JProfiler> 启用本机方法检测。
JProfiler> 可以重新转换类。
JProfiler> 可以重新转换任何类。
JProfiler> 本机库已初始化
JProfiler> VM 已初始化
JProfiler> 重新转换 6 个基类文件。
JProfiler> 检测基类。
JProfiler> 等待来自 JProfiler GUI 的连接...
JProfiler> 必须配置分析会话。忽略控制器调用。
JProfiler> 必须配置分析会话。忽略控制器调用。
JProfiler> 必须配置分析会话。忽略控制器调用。
JProfiler> 必须配置分析会话。忽略控制器调用。
JProfiler> 必须配置分析会话。忽略控制器调用。
JProfiler> 必须配置分析会话。忽略控制器调用。
JProfiler> 必须配置分析会话。忽略控制器调用。
`
下面显示了尝试使用 jpcontroller 捕获和存储指标的记录。
`./jpcontroller 28048
正在连接到 ** BLAH **
启动 JMX 管理代理...
GLib-GIO-Message:13:18:55.972:使用“内存”GSettings 后端。您的设置不会被保存或与其他应用程序共享。
连接建立成功。
请选择操作:
开始录制[1]
停止录制 [2]
启用触发器[3]
禁用触发器[4]
堆转储[5]
线程转储[6]
添加书签[7]
保存快照[8]
退出[9]
1
开始录制:
CPU 数据[1]
分配[2]
线程数据[3]
监控事件 [4]
虚拟机遥测数据[5]
复杂度分析[6]
探针 [7]
请输入以逗号分隔的所选值列表,或按 [Enter] 键进行默认选择:
[]
1,2,3
操作成功。
请选择操作:
开始录制[1]
停止录制 [2]
启用触发器[3]
禁用触发器[4]
堆转储[5]
线程转储[6]
添加书签[7]
保存快照[8]
退出[9]
8
请输入快照的文件名:
[snapshot_1.jps]
已将快照保存到 ** BLAH **/snapshot_1.jps`
代理没有任何分析设置,因此无法记录数据。
如果指定“nowait”选项,还需指定 config= 和 id= 参数以引用特定会话配置。总参数看起来像
-agentpath:/opt/jprofiler14/bin/linux-x64/libjprofilerti.so=port=8849,nowait,config=/path/to/config,id=123
会话 ID 可以在会话设置的应用程序设置选项卡的右上角看到。
我建议在桌面计算机上的 JProfiler 中配置 JProfiler 中的会话,并使用“会话”->“导出会话设置”将其导出。然后你可以省略“id”参数,因为配置只包含一个会话。
如果你这样做了,jpcontroller就可以开始录制了。