性能调优和压测看懂jvisualvm

一般调试性能的方法,可能会有打日志看时间、有库表的看库表变化;但是这种方法往往是针对一个方法处理,在针对一个相对复杂的业务调用或者调试同步并发的时候,很难直接有效,像我一般会使用jvisualvm来观察服务运行情况,另外也可以通过jconsole观察和修改jmx bean配合测试(如果写了自定义的mbean);

附上jdk的内置工具介绍:http://blog.csdn.net/fenglibing/article/details/17323515


一、准备

在使用jvisualvm之前要在服务器上开启jmx(针对一个pid)或者jstatd(针对用户有权限的所有jvm);

1.JMX 配置

远程机器的程序需要加上JVM参数

?
1
2
3
4
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.port=9090
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false

备注:另外需要检查 hostname –i,看解析出来是否为本地的IP,如是127.0.0.1或者IP为多个IP中之一,则其他的IP无效,会连接不上。

也可以使用如下的参数手动指定 hostname 或者 ip 地址

?
1
-Djava.rmi.server.hostname=192.168.0.1

然后就可以使用菜单中的 “Add JMX Connection”,连接远程地址

2.jstatd 配置

在远程主机上,新建一个 jstatd.policy 文件,内容如下:

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

然后在远程主机上启动 jstatd 并且不要关闭。

?
1
jstatd -J-Djava.security.policy=jstatd.policy -p1099

这样就可以在 JVisualVM 上,添加远程主机,并且设置 jstatd 的端口就可以了。



二、连接使用

就参考:

http://my.oschina.net/heroShane/blog/196224


三、施压

一般就自己写测试类、或junit,testng、或者jmeter或者loadrunner ;


四、关注点

1.概述

主要是观察配置的;没其他特别的内容;看看配置有没有生效,对不对就差不多了

2.监视选项

其他没什么好说,说下内存对象回收;主要看堆的峰值和回收后谷,

如果基本峰值和谷各自都在一条线上;一般可以肯定内存回收没有问题,没有泄露;

如果回收过于频繁,就有可以尝试-Xmn700m -XX:SurvivorRatio=8设置,调大eden区内存;

如果没有gc你可以通过按钮【执行gc】观察效果,

如果发现回收的效率越来越低(就是谷值越来越高),就有对象一直没被回收,或者可以dump堆内存,然后到服务器下载dump文件,再通过MAT等工具看哪些对象占用内存;

性能调优和压测看懂jvisualvm_第1张图片


3、线程

这里我们主要观察线程的运行情况,解释四个状态,应该就明白了;

  1. 运行(Running):最喜欢的状态。说明该线程正在执行代码,没有问题。
  2. 休眠(Sleeping):调用了Thread.sleep后的状态,说明线程正停在某个Thread.sleep处
  3. 等待(Wait):手动调用了wait方法,或者某些IO操作,在阻塞中等待数据。全黄的等待(Wait)的很多,一般就是调度不充分,这些线程没用到;
  4. 监视(Monitor):这里就是我想找的问题了。它表示线程想执行一段synchronized中的代码,但是发现已经有其它线程正在执行,自己被block了,只能无奈地等待。如果这种状态多,说明程序需要好好优化。

如果想看是block和wait在哪个个对象,用线程dump出来的看详细内容

性能调优和压测看懂jvisualvm_第2张图片

4、cpu采样

通过cpu采样和快照来观察运行时间;

抽样是显示抽样开始到停止这段时间的方法的cpu占用时间;

如下图就是jdbc.xxxxStream.fill(),占用了最多的时间,你可以再最下面通过过滤,关注你想要关注的类和方法;

性能调优和压测看懂jvisualvm_第3张图片

5、快照

如果你想看具体的方法在线程上是怎么占用调用时间的,就要用到快照的功能;

主要找到线程,关注方法的调用时间,一直往下看就行;看哪个时间占用最大;

它提供查询,你可以直接查询你要找大方法

性能调优和压测看懂jvisualvm_第4张图片

你可能感兴趣的:(性能调优和压测看懂jvisualvm)