Java jvisualvm性能监控简要说明


一,简要说明

JDK自带的JAVA性能分析工具。它已经在你的JDK bin目录里了,只要你使用的是JDK1.6 Update7之后的版本。点击一下jvisualvm.exe图标它就可以运行了。

二,第三方插件安装

只要安装JDK即可,运行jvisualvm.exe ,选择【工具】——【插件】——【可用插件】

三,监控程序cpu,内存使用情况

点击抽样器,点击CPU查看cpu使用情况,点击快照可以查看具体类,方法,包的CPU使用情况,并且可以过滤类名。

四,GC监控

选择要监控的tomcat pid 查看visual GC标签,如果old区长时间满了,每次回收都很少或者回收不了,说明GC有问题。

五,内存溢出,泄露监控

5.1,堆dump分析

右键点击堆Dump,生成分析报告,查看每个类的实例个数。

5.2,解决内存溢出问题

5.2.1,永久保存区内存溢出:java.lang.OutOfMemoryError: PermGen space

JVM管理两种类型的内存,堆和非堆。堆是在JVM启动时创建;非堆是留给JVM自己用的,用来存放类的信息的。它和堆不同,运行期内GC不会释放空间。如果web app用了大量的第三方jar或者应用有太多的class文件而恰好MaxPermSize设置较小,超出了也会导致这块内存的占用过多造成溢出,或者tomcat热部署时侯不会清理前面加载的环境,只会将context更改为新部署的,非堆存的内容就会越来越多。
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。

如上图所示,PermGen在程序运行一段时间后超出了我们指定的128MB,通过Classes视图看到,Java在运行的同时加载了大量的类到内存中。PermGen会存储Jar或者Class的描述信息;所以在class大量增加的同时PermGen超出了我们指定的范围。为了让应用稳定,我们需要探寻新的PermGen范围。检测时段时候后(如下图)发现PermGen在145MB左右稳定,那么我们就得到了稳定的新参数;这样PermGen内存溢出的问题得到解决。

5.2.2,堆栈区内存溢出:java.lang.OutOfMemoryError: Java heap space

1)尽早释放无用对象的引用。

好的办法是使用临时变量的时候,让引用变量在退出活动域后自动设置为null,暗示垃圾收集器来收集该对象,防止发生内存泄露。

  1. 程序进行字符串处理时,尽量避免使用String,而应使用StringBuffer。

因为每一个String对象都会独立占用内存一块区域,如:

1.String str = “aaa”;

2.String str2 = “bbb”;

3.String str3 = str + str2;

4.// 假如执行此次之后str , str2再不被调用,那么它们就会在内存中等待GC回收;

5.// 假如程序中存在过多的类似情况就会出现内存错误;

  1. 尽量少用静态变量。

因为静态变量是全局的,GC不会回收。

  1. 避免集中创建对象尤其是大对象,如果可以的话尽量使用流操作。

JVM会突然需要大量内存,这时会触发GC优化系统内存环境; 一个案例如下:

1.// 使用jspsmartUpload作文件上传,运行过程中经常出现java.outofMemoryError的错误,

2.// 检查之后发现问题:组件里的代码

3.m_totalBytes = m_request.getContentLength();

4.m_binArray = new byte[m_totalBytes];

5.// totalBytes这个变量得到的数极大,导致该数组分配了很多内存空间,而且该数组不能及时释放。

6.// 解决办法只能换一种更合适的办法,至少是不会引发outofMemoryError的方式解决。

7.// 参考:http://bbs.xml.org.cn/blog/more.asp?name=hongrui&id=3747

  1. 尽量运用对象池技术以提高系统性能。

生命周期长的对象拥有生命周期短的对象时容易引发内存泄漏,例如大集合对象拥有大数据量的业务对象的时候,可以考虑分块进行处理,然后解决一块释放一块的策略。

  1. 不要在经常调用的方法中创建对象,尤其是忌讳在循环中创建对象。

可以适当的使用hashtable,vector 创建一组对象容器,然后从容器中去取那些对象,而不用每次new之后又丢弃。

  1. 优化配置。

a.设置-Xms、-Xmx相等;

b.设置NewSize、MaxNewSize相等;

c.设置Heap size, PermGen space:


猜你喜欢

转载自blog.csdn.net/datuanyuan/article/details/108836047