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

Java 使用VisualVM通过防火墙连接到远程jstatd实例,java,linux,freebsd,Java,Linux,Freebsd,可能重复: 我写下这个问题并回答它,因为我今天花了几个小时让它工作,但我在这里找到的答案对我来说都不管用。希望这对其他人有帮助。如果您有其他解决方案,而不是我最终使用的解决方案,请随时回答问题。如果你的更好,我就接受你的 问题是:我正在尝试使用VisualVM和jstatd监控FreeBSD服务器上的一些自制java应用程序(这也应该适用于Linux服务器),但是我无法让VisualVM列出服务器上的进程,即使我在防火墙中转发了分配的和随机的jstatd端口,并且可以看到正在使用socksta

可能重复:

我写下这个问题并回答它,因为我今天花了几个小时让它工作,但我在这里找到的答案对我来说都不管用。希望这对其他人有帮助。如果您有其他解决方案,而不是我最终使用的解决方案,请随时回答问题。如果你的更好,我就接受你的


问题是:我正在尝试使用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 | grepjstat
(在Linux上可能需要使用
netstat
),确定随机端口jstatd正在使用

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

ssh-L 1099:localhost:1099登录_name@host_name

ssh-L 55663:localhost:55663登录_name@host_name


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

查看此“”,了解另一个解决方案。

这是我发现的由于某种原因对我不起作用的解决方案之一。我能让它工作的唯一方法就是按照我在回答中所描述的去做。这就是为什么我想发表这篇文章,以防其他人对可用的答案有类似的问题。上面的解决方案更简单。为什么它不起作用?我执行了那篇文章中的步骤,但它就是无法连接。我正在监视服务器上的连接,除非打开防火墙中的端口,否则没有看到到jstatd的传入连接,因此SOCKS代理由于某种原因无法工作,即使它是在客户端创建的,并且似乎处于活动状态(在本地SOCKS端口上使用telnet验证它是否打开)。我获得工作连接的唯一方法是使用我答案中的步骤。我不知道我的设置有什么不同,导致SOCKS解决方案不起作用,更不用说打开防火墙时为什么它不起作用了。这篇文章比较老,现在有一点不同,那就是你可以直接在VisualVM中指定SOCKS代理。根据您的描述,VisualVM似乎没有使用您的SOCKS代理。如果您想尝试,可以在不使用任何其他参数的情况下启动VisualVM,并在VisualVM首选项中指定SOCKS代理。事实上,我尝试过同时使用命令行参数和首选项面板,但没有成功。不过我今天会再检查一遍。这对我打开一个连接并进行基本监控很有效,但我不能进行任何采样。我想我需要更多的东西来让JMX工作?我说它不能打开JMX连接…是的,这个解决方案只针对jstatd,而不是JMX。您可能需要通过隧道连接不同的端口,我不确定。我的应用程序还没有JMX支持,所以我还没有测试。谢谢。我想这回答了我的问题:您可以使用一个ssh命令通过隧道传输两个端口,例如`ssh-L 1234:localhost:1234-L 5555:somehost:5678user@hostname