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

可能重复:
VisualVM over ssh

我正在写这个问题并回答这个问题,因为我花了几个小时才把这个工作交给我,而我在这里find的答案却没有为我工作。 希望这对其他人有帮助。 如果你有另一个解决scheme,而不是我最终使用的解决scheme,请随时回答这个问题。 如果你的更好,我会接受你的。

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

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

    首先,我在服务器上运行jstatd来查找我需要隧道的端口。 这是由(在我的情况下)首先创建一个名为tools.policy策略文件与以下内容:

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

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

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

    然后可以说随机端口是55663,我在本地机器上创建了两个SSH隧道,一个用于标准jstatd端口1099,另一个用于55663,在两个终端窗口中运行以下命令(Windows上没有这样做,但是我很确定腻子可以做到这一点):

    ssh -L 1099:localhost:1099 login_name@host_name

    ssh -L 55663:localhost:55663 login_name@host_name

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

    请参阅“ 通过带有SOCKS的ssh隧道运行VisualVM ”获取另一个解决方案。