Maven build 中启动 JMX Agent

为了监控 JVM,研究了下 VisualVM,但是不知道怎么导出里面的数据,可导出就比较方便做数据比对,而且也不知道怎么控制显示的历史信息跨度。而这两点在 JConsole 中都可以。于是要折腾 JConsole,一开始还不怎么顺利,虽然看上去只是几项配置。
因为在开发过程当中都是使用 mvn jetty:run 启动的。原来以为是这样:

mvn jetty:run -Dcom.sun.management.jmxremote.port=9410 \
    -Dcom.sun.management.jmxremote.authenticate=false \
    -Dcom.sun.management.jmxremote.ssl=false

然后使用 jconsole 127.0.0.1:9410 ,提示是 Connection refused

后来了解到,如果 JMX Agent 启动成功的话,会产生一个端口监听。
再执行 netstat -a | grep 9410 ,毫无反应。

网上乱 google jconsole, jmx agent, jmx remote, jmx connection refused 等关键字都没什么头绪。
找到一篇 关于 jconsole 的错误排查 的不错的文章,但是情况不吻合,这里唯一区别的是不是直接 java 启动,而是通过 mvn ,曾经使用过调试,需要添加 MAVEN_OPTS 的参数的。一试成功。

set MAVEN_OPTS=-Xmx512m -Dcom.sun.management.jmxremote.port=9400 \
    -Dcom.sun.management.jmxremote.authenticate=false \
    -Dcom.sun.management.jmxremote.ssl=false %MAVEN_OPTS%

再进一步,通常是在 eclipse 的 m2e 插件启动 jetty:run,如下图设置

经过多次验证,基本肯定这里存在 bug 的,设置 MAVEN_OPTS 是无效的,而且不报错。
既然这是作为 JDK 参数的,再尝试将参数添加到 jdk 的启动参数里面,居然报错了~

Exception thrown by the agent : java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException: LEX-WS: LEX-WS

遂往 hosts 添加 127.0.0.1 LEX-WS
启动依然报错。
郁闷,重启一下 eclipse,在启动,居然好了。莫非动态修改 hosts 文件 jvm 里是无法动态跟上的?

好,现在一切就绪,再次执行 jconsole 127.0.0.1:9410

这是在本地模拟远程的情况。在远程的配置下,还需要加入一个 -Djava.rmi.server.hostname=<host.name.or.ip>,否则,可能会出现连接没有拒绝,但是总是连接不成功的情况,那也是相当的郁闷的。

PS,这样配置之后,也是可以在 visualvm 里通过添加 JMX Connection 来做监控的,而且多了个线程监控。