行业资讯
正厚软件-性能测试系列之使用JVisualVM监测程序
2019-05-24

一、监测Windows本地环境

1、在本地jdk的bin目录下双击jvisualvm.exe,启动此程序。

2、当需要监测的项目在运行时,会出现一个Tomcat程序,表示本地运行的工程,选择即可查看。

 

二、监测Linux环境的工程

1、在打开jvisualvm后,当选择添加JMX连接时,需要输入服务器IP、监测端口、用户名、密码。当选择添加jstatd连接时需要输入JDK中的监测端口。

其中JMX不可以使用Visual GC插件但能监控CPU,而jstatd不可以使用Visual GC插件但不能监控CPU。

 

2、配置JMX的连接方式

1)打开程序所在的tomcat中bin目录下的catalina.sh,设置JAVA_OPTS。若8099端口被占用则换一个。其中服务器IP(不能是127.0.0.1)和监测端口必填。

JAVA_OPTS="-Djava.rmi.server.hostname=服务器IP -Dcom.sun.management.jmxremote.port=监测端口 -Dcom.sun.management.jmxremote.rmi.port=监测端口 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false""

查看端口是否使用:netstat -nltpe|grep 端口

2)若防火墙有阻拦,则需要设置防火墙白名单端口。

在防火墙的/etc/firewalld/zones/public.xml路径下,添加不阻拦的端口,然后重启防火墙。

重启防火墙命令:firewall-cmd --reload

3)选择添加JMX连接,输入服务器IP、监测端口、用户名、密码即可使用。

 

3、配置jstatd的连接方式

1)在服务器下使用的jdk的bin目录中(如/usr/local/java/jdk1.8.0_131/bin)添加jstatd.all.policy文件,文件内容如下:

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

2)在此bin目录下执行命令:

./jstatd -J-Djava.rmi.server.hostname=服务器IP -J-Djava.security.policy=jstatd.all.policy -p 监测端口

服务器IP是运行项目的服务器真实IP,不能填127.0.0.1,通过绑定一个端口来监测项目。查看端口是否使用:

netstat -nltpe|grep 端口

3)选择添加jstatd连接,输入监测端口,确定后即可使用。

4)在列举的选项中选择Jstatd即可查看GC情况。

 

三、添加JVisualVM插件

1、在工具菜单栏中选择工具→插件,弹出如下界面,选择可用插件页签,下载相应的插件。其中Visual GC是使用比较广泛的。

 

2、在已安装的页签中,可以选择卸载已下载的插件。

 

3、当插件下载失败时,可以去设置页签中配置可用的更新中心。主要是验证它的URL地址可用,例如:https://visualvm.github.io/archive/uc/8u40/updates.xml.gz

 

四、Visual GC介绍

整个区域分为三部分:spaces、graphs、histogram

1、spaces区域:代表虚拟机内存分布情况

从图中可以看出,虚拟机被分为Perm、Old、Eden、S0、S1。

注意:如果对每个区域基本概念不是很熟悉的可以先了解下java虚拟机运行时数据区这篇文字。

1)perm:英文叫做Permanent Generation,我们称之为永久代。(根据深入java虚拟机作者说明,这里说法不是不是很正确,因为hotspot虚拟机的设计团队选择把GC分代收集扩展至此而已,正确的应该叫做方法区或者非堆)。

2)通过VM Args:-XX:PermSize=128m -XX:MaxPermSize=256m 设置初始值与最大值。

3)heap:java堆(java heap)。它包括老年代(图中Old区域)和新生代(图中Eden/S0/S1三个统称新生代,分为Eden区和两个Survivor区域),他们默认是8:1分配内存。

4)通过VM Args:-xms512m -Xmx512m -XX:+HeapDumpOnOutofMemoryError -Xmn100m -XX:SurvivorRatio=8 设置初始堆内存、最大堆内存、内存异常打印dump、新生代内存、新生代内存分配比例(8:1:1),因为Heap分为新生代跟老年代,所以512M-100M=412M,老年代就是412M(初始内存跟最大内存最好相等,防止内存不够时扩充内存或者Full GC,导致性能降低)。

 

2、Graphs区域:内存使用详细介绍

1)Compile Time(编译时间):6368compiles 表示编译总数,4.407s表示编译累计时间。一个脉冲表示一次JIT编译,窄脉冲表示持续时间短,宽脉冲表示持续时间长。

2)Class Loader Time(类加载时间): 20869loaded表示加载类数量, 139 unloaded表示卸载的类数量,40.630s表示类加载花费的时间。

3)GC Time(GC Time):2392collections表示垃圾收集的总次数,37.454s表示垃圾收集花费的时间,last cause表示最近垃圾收集的原因。

4)Eden Space(Eden 区):括号内的31.500M表示最大容量,9.750M表示当前容量,后面的4.362M表示当前使用情况,2313collections表示垃圾收集次数,8.458s表示垃圾收集花费时间。

5)Survivor 0/Survivor 1(S0和S1区):括号内的3.938M表示最大容量,1.188M表示当前容量,之后的值是当前使用情况。

6)Old Gen(老年代):括号内的472.625M表示最大容量,145.031M表示当前容量,之后的87.031表示当前使用情况,79collections表示垃圾收集次数 ,28.996s表示垃圾收集花费时间。

7)Perm Gen(永久代):括号内的256.000M表示最大容量,105.250M表示当前容量,之后的105.032M表示当前使用情况。

 

3、Histogram区域:survivor区域参数跟年龄柱状图

1)Tenuring Threshold:表示新生代年龄大于当前值则进入老年代。

2)Max Tenuring Threshold:表示新生代最大年龄值。

3)Tenuring Threshold与Max Tenuring Threshold区别:Max Tenuring Threshold是一个最大限定,所有的新生代年龄都不能超过当前值,而Tenuring Threshold是个动态计算出来的临时值,一般情况与Max Tenuring Threshold相等,如果在Suivivor空间中,相同年龄所有对象大小的总和大于Survivor空间的一半,则年龄大于或者等于该年龄的对象就都可以直接进入老年代(如果计算出来年龄段是5,则Tenuring Threshold=5,age>=5的Suivivor对象都符合要求),它才是新生代是否进入老年代判断的依据。

4)Desired Survivor Size:Survivor空间大小验证阙值(默认是survivor空间的一半),用于Tenuring Threshold判断对象是否提前进入老年代。

5)Current Survivor Size:当前survivor空间大小。

6)histogram柱状图:表示年龄段对象的存储柱状图。

7)如果显示指定-XX:+UseParallelGC --新生代并行、老年代串行收集器 ,则histogram柱状图不支持当前收集器。

前期文章参考:
     正厚软件-性能测试系列1之Jmeter入门指南
     正厚软件-性能测试系列之使用JMeter进行性能测试

好环境丨好课程丨好老师丨好就业丨好学员

变态严管,负责用心!

ISTQB考证、项目合作、软件测试、JAVA技术提升请认准正厚软件

 

咨询热线
预约试听:025-86665061
官方公众号:ZhenghouSoft
技术热线:025-86665061
联系地址
南京总部:南京市鼓楼区湖南路16号5楼
重庆中心:重庆市渝中区投资大厦6楼
武汉中心:江夏区光谷智慧园16栋
微信公众号
联系我们
咨询热线:025-86665061
友情链接
Copyright © 2018 南京正厚软件 苏ICP备17057415号 网站地图 XML地图