最近项目发现了服务有内存泄漏的问题,但是在jvm上并没有配置即jvm没有配置
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof 这两个参数,导致在发生了oom后只能看到日志中有OOM异常,其他的并不能分析出来,等监控到的时候发现进程已经成了僵尸进程,根本没法通过jmap导出dump。
为了模拟和分析问题在dev环境将-Xmx -XX:MaxMetaspaceSize(我是jdk1.8)都进行了缩小为了重现问题,接下来想监控oom的过程,于是就想用jvisual vm连接到jetty服务器上去进行jvm的监控。
- 服务端的配置
经过查看jetty的官方文档, jetty-jmx文档 远程链接需要设置几个参数,在此列一下:
由于我使用的外置的jetty,所以在start.ini中加入如下配置:
#
# Initialize module jmx-remote
#
--module=jmx
--module=jmx-remote
## JMX Configuration
## Enable for an open port accessible by remote machines
jetty.jmxrmihost=192.168.1.2
jetty.jmxrmiport=1099
主要作用就是启用jmx和jmx-remote两个module,然后通过`jetty.jmxrmihost`和`jetty.jmxrmiport`设置服务器的ip抵制和要远程链接端口,需要注意的是这里的端口一定是开了防火墙的,否则访问不到,这种方法是没有使用认证的方式(在测试环境内网无所谓,但是在外网的话建议时候带认证方式的连接方法),也可以参考官网使用认证的方式进行连接。保存配置重启jetty服务
- jconsole或者jvisual vm客户端的配置
可以先通过telnet进行测试连通性,如果没问题的话可以先打开jconsole(jdk的安装目录/bin/jconsole.exe)或者jvisualvm(jdk的安装目录/bin/jvisualvm.exe)
jvisualvm也是一样的道理,点击远程,添加jmx连接即可,此时jvm的使用轻咳就一目了然了。