看啥推荐读物
专栏名称: 兰彻
软件工程师
目录
相关文章推荐
今天看啥  ›  专栏  ›  兰彻

Java VisualVM 使用技巧

兰彻  · 掘金  ·  · 2019-01-16 01:20

对于 JAVA 程序员来说,JVM 是一个经常讨论的话题。当项目上线时我们会关注 JVM 的监控数据,从侧面了解我们项目的运行情况。下面我会从两个方面来简要讲解一下 JVM 常见的调优技巧,以便合理的配置机器的资源。

JVM 监控工具

为了了解 JVM 的运行情况,我们需要选择一个监控工具来帮助我们收集数据,我常用的监控工具是 JDK 自带的 Java VisualVM。 一般我们的项目都是运行在远程的服务器上,常见的配置方式有两种,下面讲解一下这两种方式的配置步骤。

JMX 连接

JMX 需要配置 JVM 参数,当 JVM 启动时我们就可以在 Java VisualVM 上面看到监控信息,不需要我们再额外做一些操作。 如果应用是部署在 Tomcat 上面的,我们可以在 setenv.sh 文件中添加 JMX 参数,如果没有该文件可以新建一个并赋予可执行权限。配置项如下:

#jmx
export CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote"
export CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.port=9090"
export CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"
export CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.ssl=false"

注:我这里配置的端口是 9090,远程连接时记得关闭防火墙或者允许该端口通过防火墙

1.通过如下界面添加远程服务器的信息

2.配置 JMX 信息

3.查看该服务器的监控信息

注:JXM 的特点是只需要配置一次,以后需要查看监控信息时只需要打开 Java VisualVM 即可,但是 JMX 的监控信息不是很详细,只能查看堆以及非堆的内存情况,如果我们想查看堆中年轻代、老年代内存的分配情况,JMX 无法查看到上述信息。

JStatd 连接

1.在服务器上添加一个配置文件(jstatd.policy),配置信息如下:

grant codebase "file:${java.home}/../lib/tools.jar" {
         permission java.security.AllPermission;
    };

2.在服务器上面执行如下命令:

jstatd -J-Djava.security.policy=jstatd.policy -J-Djava.rmi.server.hostname=172.20.9.50 -p 1099

注:将上述 IP 改为当前服务器的 IP,端口也需要本地机器可以访问。

3.安装 Visual GC 插件

4.选择对应的 JVM 进程查看监控信息

从上面的图中我们可以很清晰的看到 JVM 不同代的内存使用情况,方便我们了解当前 JVM 的运行情况。

JVM 监控信息的解读

上面我们通过工具可以实时查看 JVM 运行的数据,有了这些数据我们可以判断当前分配给 JVM 的资源是否合理,线面讲解一下如果 解读 Visual VM 上面给出的信息。

Spaces 信息

从上图中我们可以看到 Metaspace、Old、Eden、SO、S1 五个柱状图,了解过 JVM 的同学应该知道这几个名词的概念, Metaspace 对应的是元数据区,也就是 JDK1.8 以前的永久带,Old 对应的是老年代、以及年轻代中的Eden、S0、S1。上面需要注意的是 Metaspace 在 JDK1.8 中属于非堆区,所以 ‘-Xmx’ 这类堆的配置并不会影响到 Metaspace,如果需要配置 Metaspace 请使用 ‘-XX:MaxMetaspaceSize’ 配置项。

Graphs 信息

Graphs 中的信息比较详细,不仅有图形还有数据,数据的含义如下:

  1. 括号中左边的数据 这个是根据 -Xmx 参数分配的内存,表示区域最大可以分配到的内存

  2. 括号中右边的数据 该数据表示的是该区域当前被分配到的内存

  3. 括号右边的数据 该数据表示当前该区域已经被使用的内存

有了上面的这类数据我们就可以知道当前 JVM 的运行情况了,我们可以根据监控工具的趋势图判断当前 JVM 的内存是否够用,如果不够用我们还可以分析不同区域内存的使用情况。一般来说如果我们的应用对响应时间不是特别敏感的话,如果我们的应用平凡发生 Full GC,我们可以调大老年代或者 Metaspace 区域的内存,调小年轻代区域的内存,虽然这样会增加 Major GC 的频率,但相对 Full GC 来说负面影响还是很小的。

No related posts.




原文地址:访问原文地址
快照地址: 访问文章快照