这个问题已经在这里有了答案:
已关闭8年。
我正在写这个问题并回答它,因为我花了几个小时使它今天开始工作,而我在这里找不到的答案对我有用。希望这对其他人有帮助。如果您有除我最终使用的解决方案之外的其他解决方案,请随时回答此问题。如果您的情况更好,我会接受您的情况。
问题:我正在尝试使用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的随机端口(我不确定在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进程。