使用 jmeter 和 gcview 观察 JVM 垃圾收集情况和性能
作者:韩超
工具介绍:
jakarta-jmeter-2.3.4
一款免费的压力测试软件可以对应用服务器和DB 进行压力测试,能够返回服务性能指标值
gcviewer-1.29
是免费的开源垃圾回收视图化查看工具
这个工具只能在1.5 以下的版本中运行,1.6 以后没有对应。这个工具是根据JVM 的GC 执行的log 来视图化的,因此我们第一件要做的就是产生gc log 。要产生gc log 需要修改JVM 的配置。
各版本JDK 配置如下:(官方说法)
- Sun JDK 1.4/1.5 with the options -Xloggc:<file> [ -XX:+PrintGCDetails ]
- Sun JDK 1.2.2/1.3.1/1.4 with the option -verbose:gc
- IBM JDK 1.3.1/1.3.0/1.2.2 with the option -verbose:gc
- IBM iSeries Classic JVM 1.4.2 with option -verbose:gc
- HP-UX JDK 1.2/1.3/1.4.x with the option -Xverbosegc
- BEA JRockit 1.4.2/1.5 with the option -verbose:memory
实验方法
介绍
此实验目的是为了通过实验学会jmeter 和gcviewer 工具的使用,是我们在以后的工作中能够更好的通过此工具定位中间件问题,更好的开展工作。
实验环境
RedHat 虚拟机(Linux localhost 2.6.9-89.0.11.ELsmp #1 SMP Tue Sep 15 07:16:37 EDT 2009 i686 i686 i386 GNU/Linux )
中间件("WebLogic Platform" Version="10.3.1.0" )
JDK (java full version "1.6.0_11-b03" )
Weblogic JDK 设置(java -client -Xms256m -Xmx512m -XX:CompileThreshold=8000 -XX:PermSize=48m -XX:MaxPermSize=128m )
实验步骤
1、 到weblogic 域目录下bin 目录下打开startWebLogic.sh 文件在文件中加一行JAVA_OPTIONS="${JAVA_OPTIONS} -verbose:gc -Xloggc:gc.log" 重启weblogic ,此时在域目录下产生了gc.log 文件。
2、 启动jmeter 工具建立线程组(配置线程数1000 ,停顿时间1 秒,循环次数是永远)。
然后在循环组里建立了HTTP 请求(请求的URL 是 http://192.168.1.102:7001/console/console.portal?_nfpb=true&_pageLabel=ServerMonitoringPerformancePage ,http 请求时同时发送username=weblogic ,password=12345678 )
建立使用图表和列表监控器查看压力测试结果
1、 当发现使用浏览器无法进入weblogic 控制台时停止压力测试,观察gc.log 发现
11538.463: [Full GC 520255K->502074K(520256K), 3.4326990 secs]
11542.221: [Full GC 520255K->501900K(520256K), 3.4342490 secs]
11545.797: [Full GC 520255K->503636K(520256K), 3.5118180 secs]
11549.563: [Full GC 520255K->504382K(520256K), 3.2005410 secs]
11552.915: [Full GC 520255K->502837K(520256K), 3.2495890 secs]
11556.393: [Full GC 520255K->502607K(520256K), 3.0438470 secs]
11559.630: [Full GC 520253K->503526K(520256K), 3.0430040 secs]
11562.785: [Full GC 520255K->503659K(520256K), 3.3416990 secs]
11566.199: [Full GC 520255K->507217K(520256K), 3.1960570 secs]
11569.887: [Full GC 520245K->505854K(520256K), 3.2310940 secs]
11573.307: [Full GC 520253K->507130K(520256K), 3.4036820 secs]
11577.002: [Full GC 520251K->506423K(520256K), 4.3883250 secs]
11581.734: [Full GC 520251K->503336K(520256K), 2.9926290 secs]
11584.866: [Full GC 520255K->505005K(520256K), 2.9095000 secs]
11588.180: [Full GC 520255K->502112K(520256K), 3.3802670 secs]
11591.926: [Full GC 520256K->501053K(520256K), 3.0464990 secs]
11595.410: [Full GC 520255K->497727K(520256K), 2.9174710 secs]
说明频繁在做Full GC weblogic 无法正常的相应用户请求。
2、 使用gcviewer 工具分析gc.log
从图中可以看出在进行压力测试过程中JVM 由原来测256M 增加到512M (红色部门代表total heap ),垃圾回收出现逐渐上升的趋势(图中蓝色部分)说明有一部分对象不能正确回收也就是内存泄露存在。图中黑色部分说明此时JVM 已经出现异常(黑色代表Full GC )频繁进行Full GC 而每次FULL GC 也不能回收内存而FULL GC 时JVM 不想应用户请求所以导致weblogic 控制台进不去。图中绿色线代表每次垃圾回收时间从中可以看出垃圾回收时间也在增加。