首页 > 代码库 > JVM监控及分析(02)

JVM监控及分析(02)

一、可视化监控工具

1、jconsole

技术分享

内存越大,FullGC的时间约长

通过线程活动情况,可以帮助我们估计tomcat的线程池配置的大小

 

2、jvisualvm.exe

技术分享

安装所有插件

技术分享

技术分享

主要对CPU、内存进行抽样

 

 

3、jprofiler

1)安装及连接:

将jprofiler_linux_7_2_3.tar.gz文件上传至linux服务端的任意目录下,并解压:

技术分享

打开window客户端的jprofiler,进行相应设置:

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

将上图中,划红框的那段话,加入到服务端tomcat的bin目录下catalina.sh文件中:

技术分享

重启服务端tomcat

技术分享

技术分享

至此客户端的jprofiler成功连接上linux服务端的jprofiler。

2)监控内存使用异常

对test1项目进行压测,观察jprofiler中内存的变化情况

压测1次:

技术分享

随着不断的加压:

技术分享

那么判断cn.test.TestBean可能会产生内存泄漏,将该项目添加重点关注

技术分享

点击MarkCurrent:

技术分享

再次不断的加压:

技术分享

上图中,随着压力的增加,cn.TestBean这栏,棕色的部分不断的增加,并且上涨的速度很快,进行一次FullGC:

技术分享

可以看到,在FullGC过后,除了cn.test.TestBean之外的监控项,其他的监控项都会有不同程度的内存释放,从而判断cn.test.TestBean会产生内存泄漏,那么如何判断对应是哪个方法呢?

技术分享

技术分享

技术分享

技术分享

技术分享

上图显示了输入的引用,点击"show in Graph"

技术分享

这样就可以找到产生内存溢出的页面对象了,当然还有其它的查看方式。

3)监控CPU热点

技术分享

可以监控到sql层面

 

总结:

tps曲线发生上下抖动,可能的原因(响应时间类似):

1)JVM进行比较频繁的FullGC或者是

2)资源池用满了释放掉或者是

3)cpu

4)频繁的IO操作

 

二、jvm的基本配置参数

1、示例

JAVA_OPTS="-Xms256m -Xmx256m -Xss1024K -XX:PermSize=128m -XX:MaxPermSize=128m -Djava.rmi.server.hostname=192.168.20.129 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"

2、常见配置
堆设置
-Xms:初始堆大小
-Xmx:最大堆大小
-XX:NewSize=n:设置年轻代大小
-XX:NewRatio=n:设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
-XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5
-XX:MaxPermSize=n:设置持久代大小
收集器设置
-XX:+UseSerialGC:设置串行收集器
-XX:+UseParallelGC:设置并行收集器
-XX:+UseParalledlOldGC:设置并行年老代收集器
-XX:+UseConcMarkSweepGC:设置并发收集器
垃圾回收统计信息
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename
并行收集器设置
-XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。
-XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
-XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
并发收集器设置
-XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。
-XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。

 

3、一个性能较好的web服务器jvm参数配置
-server//服务器模式
-Xmx2g //JVM最大允许分配的堆内存,按需分配
-Xms2g //JVM初始分配的堆内存,一般和Xmx配置成一样以避免每次gc后JVM重新分配内存。
-Xmn256m //年轻代内存大小,整个JVM内存=年轻代 + 年老代 + 持久代
-XX:PermSize=128m //持久代内存大小
-Xss256k //设置每个线程的堆栈大小
-XX:+DisableExplicitGC //忽略手动调用GC, System.gc()的调用就会变成一个空调用,完全不触发GC
-XX:+UseConcMarkSweepGC //并发标记清除(CMS)收集器
-XX:+CMSParallelRemarkEnabled //降低标记停顿
-XX:+UseCMSCompactAtFullCollection //在FULL GC的时候对年老代的压缩
-XX:LargePageSizeInBytes=128m //内存页的大小
-XX:+UseFastAccessorMethods //原始类型的快速优化
-XX:+UseCMSInitiatingOccupancyOnly //使用手动定义初始化定义开始CMS收集
-XX:CMSInitiatingOccupancyFraction=70 //使用cms作为垃圾回收使用70%后开始CMS收集
说明:
-Xmn和-Xmx之比大概是1:9,如果把新生代内存设置得太大会导致young gc时间较长
一个好的Web系统应该是每次http请求申请内存都能在young gc回收掉,full gc永不发生,当然这是最理想的情况
xmn的值应该是保证够用(够http并发请求之用)的前提下设置得尽量小

-----------------------------------------------------------------------

每一个光鲜的背后都有不为他人所知的付出,如果从前、现在亦或更久,我们是否会改变... ...

 

JVM监控及分析(02)