我正在写这个问题并回答它,因为我花了几个小时使它今天开始工作,而我在这里找不到的答案对我有用。希望这对其他人有帮助。如果您有除我最终使用的解决方案以外的其他解决方案,请随时回答此问题。如果您的情况更好,我会接受您的情况。
问题:我正在尝试使用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
jstatd -J-Djava.security.policy=tools.policy
然后,我确定通过运行jstatd使用了随机端口sockstat | grep jstat(netstat不确定,可能需要在Linux 上使用它)。
sockstat | grep jstat
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进程。