使用 VisualVM 通过防火墙连接到远程 jstatd 实例

2022-09-02 09:05:52

可能的重复:
VisualVM over ssh

我正在写这个问题并回答它,因为我花了几个小时让它今天工作,我在这里找到的答案对我不起作用。希望这对其他人有所帮助。如果您还有另一种解决方案,而不是我最终使用的解决方案,请随时回答这个问题。如果你的更好,我会接受你的。

问题是:我试图使用 VisualVM 和 jstatd 在我的 FreeBSD 服务器上监视一些自制的 java 应用程序(这应该也适用于 Linux 服务器),但是我无法让 VisualVM 列出服务器上的进程,即使我在防火墙中转发了分配的和随机的 jstatd 端口,并且可以看到使用 sockstat 建立的连接。


答案 1

而不是每次运行jstatd时都创建防火墙规则(因为它每次都会烦人地选择一个新的随机端口),我让它与SSH隧道一起使用。

首先,我在服务器上运行jstatd以查找需要隧道传输的端口。这是通过(在我的情况下)首先创建一个名为 tools.policy 的策略文件来完成的,其中包含以下内容:

grant codebase "file:${java.home}/../lib/tools.jar" {
    permission java.security.AllPermission;
};

然后运行以下命令:jstatd -J-Djava.security.policy=tools.policy

然后我确定jstatd通过运行使用的随机端口(可能需要在Linux上使用,我不确定)。sockstat | grep jstatnetstat

然后假设随机端口是55663,我在本地计算机上创建了两个SSH隧道,一个用于标准jstatd端口1099,另一个用于55663,通过在两个终端窗口中运行以下命令(在Windows上没有这样做,但我非常确定putty可以做到这一点):

ssh -L 1099:localhost:1099 login_name@host_name

ssh -L 55663:localhost:55663 login_name@host_name

打开两个隧道后,我打开VisualVM,右键单击左侧的“本地”计算机,然后选择“添加jstatd连接”。我单击右侧的“添加默认值”按钮,并确保端口设置为1099。我点击“确定”按钮保存它,并立即看到我的远程Java进程显示在“本地”部分中。


答案 2

有关其他解决方案,请参阅此“使用 SOCKS 通过 ssh 隧道运行 VisualVM”。


推荐