连接问题故障排除
当无法建立分析会话时,首先要做的是查看被分析应用程序或应用程序服务器的终端输出。对于应用程序服务器,
标准错误流通常被写入一个日志文件。这可能是一个单独的日志文件,而不是应用服务器的主日志文件。
例如,Websphere应用服务器会写入一个native_stderr.log
文件,其中只包括标准错误输出。
根据标准错误输出的内容,搜索问题的方向不同:
连接问题
如果标准错误包含"Waiting for connection ..."
,则说明应用程序的配置是正确的。
那么问题可能与以下问题有关:
- 你是否忘记在本地机器上的JProfiler GUI中启动"Attach到远程JVM"会话? 除非分析代理被配置为使用"nowait"选项立即启动, 否则它将等待JProfiler GUI连接后才让VM继续启动。
- 在会话设置中是否正确配置了主机名或IP地址?
-
你是否配置了错误的通信端口?通信端口与HTTP或其他标准端口号无关,且不得与任何已在使用的端口相同。
对于分析的应用程序,通信端口被定义为分析VM参数的一个选项。
对于VM参数
-agentpath:<jprofilerti库路径>=port=25000
,将使用25000端口。 - 本地机器和远程机器之间是否有防火墙?可能有传入和传出连接的防火墙规则配置,或者中间的网关机上有防火墙。
端口绑定问题
如果标准错误中包含关于无法绑定Socket的错误信息,则说明该端口已经在使用中。 在这种情况下,请检查以下问题:
- 你是否多次启动了分析的应用程序?每个分析应用程序都需要一个单独的通信端口。
- 是否有任何以前分析运行的僵尸java进程阻塞了端口?
- 是否有其他的应用程序在使用该通信端口?
如果标准错误中没有以JProfiler>
为前缀的行,而你的应用程序或应用程序服务器正常启动,
则-agentpath:[jprofilerti库路径]
VM 参数没有被包含在 Java 调用中。
你应该找出你的启动脚本中实际执行的是哪个java调用,并为其添加VM参数。
Attach问题
当要Attach到一个正在运行的JVM时,有时可能在所有JVM列表中看不到你所感兴趣的那个JVM。找到引起这个问题的原因,对于理解
Attach的工作机制非常重要。当JVM启动时,它会将一个PID文件写入到临时文件夹中的hsperfdata_$USER
目录下,
通过这个临时目录可以发现JVM。然后只有相同用户或管理员用户可以Attach到该JVM。JProfiler可以帮助你以管理员用户连接到一个JVM。
在Windows上,使用显示服务按钮显示所有JVM服务进程。JProfiler安装一个帮助服务,该服务将以系统账户运行, 它可以连接到以系统账户以及已配置的用户账户运行的服务。这个服务叫做“JProfiler助手”,当你点击该按钮时,就会被安装。你必须确认 UAC提示以允许安装该服务。当JProfiler退出时,这个服务会被再次卸载。
在Linux上,你可以使用Attach对话窗口中的用户切换器切换到root账户。当你分析一个本地JVM以及Attach一个远程Linux或macOS机器时, 会显示这个用户切换器。对于远程Attach的情况,你也可以切换到一个不同的非root用户。如果你拥有root密码,那么你应该总是切换到root, 而不是运行服务的实际用户。
如果在Linux上,一个你认为应该被显示的JVM没有显示,这个问题通常和临时目录有关。有可能是/tmp/hsperfdata_$USER
目录访问权限的问题。在这种情况下,你可以删除该目录,然后重启JVM。被Attach的进程必须对/tmp目录有写入权限,否则的话无法Attach。
如果你使用了systemd你感兴趣的进程有可能在其systemd服务文件中设置了PrivateTmp=yes
。
那么,PID文件会被写入到一个不同的位置。如果你使用Attach对话窗口中的用户切换器切换到root用户,或以root用户使用CLI工具,
JProfiler将处理这些。