VisualGC到docker中运行的远程JVM

我从Oracle的VisualGC 文档 (以及我从这个主题find的所有东西,例如这个问题 )的文档中了解到,当使用VisualGC连接到远程JVM时,需要使用jstatd服务器。

我的JVM运行在Docker容器中,运行在该容器中的唯一进程就是JVM,我希望这样保持容器的最佳实践 。

有没有什么办法可以使用VisualGC(我的客户端是VisualVM的VisualGC插件)与在Docker中运行的JVM?

这是如何轻松做到这一点。

  1. 以这种方式在远程主机上启动ejstatd (从ejstatd文件夹执行): mvn exec:java -Dexec.args="-pr 1099 -ph 1100 -pv 1101"
  2. 在远程主机上打开这3个端口,并将它们提供给本地机器: 10991101
  3. 使用本地机器上的jps识别正在运行的Java应用程序的<lvmid> (使用远程主机名replace<remotehost> ): jps -m -l rmi://<remotehost>:1099
  4. 你现在可以通过启动它来使用visualgc (用正确的值replace<lvmid><remotehost> ): visualgc <lvmid>@<remotehost>:1099

免责声明:我是开源ejstatd工具的作者

只需在jstatd中将jstatd与您的应用程序一起使用即可。 我不认为这违反了docker的最佳做法。

VisualGC和朋友通过JMX连接,通常通过1099端口连接。所以,如果你设置你的Docker容器来通过docker容器内端口1099的TCP请求传递到外部可访问的端口,那么你应该能够远程连接到它。