JVM监控及分析(02)

摘要:
请注意,“幸存者”区域有两个。公式为1/(1+n)并发收集器设置-XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU。并行收集线程数。

一、可视化监控工具

1、jconsole

JVM监控及分析(02)第1张

内存越大,FullGC的时间约长

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

2、jvisualvm.exe

JVM监控及分析(02)第2张

安装所有插件

JVM监控及分析(02)第3张

JVM监控及分析(02)第4张

主要对CPU、内存进行抽样

3、jprofiler

1)安装及连接:

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

JVM监控及分析(02)第5张

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

JVM监控及分析(02)第6张

JVM监控及分析(02)第7张

JVM监控及分析(02)第8张

JVM监控及分析(02)第9张

JVM监控及分析(02)第10张

JVM监控及分析(02)第11张

JVM监控及分析(02)第12张

JVM监控及分析(02)第13张

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

JVM监控及分析(02)第14张

重启服务端tomcat

JVM监控及分析(02)第15张

JVM监控及分析(02)第16张

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

2)监控内存使用异常

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

压测1次:

JVM监控及分析(02)第17张

随着不断的加压:

JVM监控及分析(02)第18张

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

JVM监控及分析(02)第19张

点击MarkCurrent:

JVM监控及分析(02)第20张

再次不断的加压:

JVM监控及分析(02)第21张

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

JVM监控及分析(02)第22张

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

JVM监控及分析(02)第23张

JVM监控及分析(02)第24张

JVM监控及分析(02)第25张

JVM监控及分析(02)第26张

JVM监控及分析(02)第27张

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

JVM监控及分析(02)第28张

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

3)监控CPU热点

JVM监控及分析(02)第29张

可以监控到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)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇物联网时代-新基建-ThingsBoard调试环境搭建判断字符串中是否存在的几种方案:string.indexof、string.contains、list.contains、list.any几种方式效率对比下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【性能测试】:JVM内存监控策略的方法,以及监控结果说明

JVM内存监控主要在稳定性压测期间,监控应用服务器内存泄露等问题; 【JVM远程监控设置】 1、打开WAS控制台:https://ip:port/ibm/console/login.do 2、进入路径:应用程序服务器 > Server_Name > 进程定义> Java 虚拟机 3、在通用JVM参数中开启远程访问,并设置远程访问端口为10...

JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释 (生动形象)

【转自】:https://blog.csdn.net/sd4015700/article/details/50109939 jvm区域总体分两类,heap区和非heap区。heap区又分:Eden Space(伊甸园)、Survivor Space(幸存者区)、Tenured Gen(老年代-养老区)。 非heap区又分:Code Cache(代码缓存区...

JDK8中JVM堆内存划分

一:JVM中内存 JVM中内存通常划分为两个部分,分别为堆内存与栈内存,栈内存主要用运行线程方法 存放本地暂时变量与线程中方法运行时候须要的引用对象地址。 JVM全部的对象信息都 存放在堆内存中。相比栈内存,堆内存能够所大的多,所以JVM一直通过对堆内存划分 不同的功能区块实现对堆内存中对象管理。 堆内存不够最常见的错误就是OOM(OutOfMemoryE...

Java内存溢出的详细解决方案 转载

一、内存溢出类型 1、java.lang.OutOfMemoryError: PermGen space JVM管理两种类型的内存,堆和非堆。堆是给开发人员用的上面说的就是,是在JVM启动时创建;非堆是留给JVM自己用的,用来存放类的信息的。它 和堆不同,运行期内GC不会释放空间。如果web app用了大量的第三方jar或者应用有太多的class文件而恰好...

JVM(七)JVM常量池详解

一、Class常量池解析   定义:Class常量池可以理解为是Class文件中的资源仓库。   内容:Class文件中除了包含类的版本、字段、方法、接口等描述信息外, 还有一项信息就是常量池,用于存放编译期生成的各种字面量和符号引用。   我们可以通过一个命令来查看我们字节码文件的内容: 字面量   定义:字面量就是指由字母、数字等构成的字符串或者数值...

mycat初识启动遇到的问题总结

1.Mycat 使用版本1.6.4,JDK使用1.7.0_79,启动时wrapper.log日志报错:Unable to locate the class io.mycat.MycatStartup STATUS | wrapper | 2021/02/09 15:34:54 | --> Wrapper Started as Daemon STATU...