zoukankan      html  css  js  c++  java
  • 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并发请求之用)的前提下设置得尽量小

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

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

    如欢如殇 授以青春鲜活肢体奔忙 如思如忘 驱以老朽深沉灵魂冥想 始自情热激荡 从未敢终于世事炎凉 无能执手相望 无法去尝试结发同床 无力至心死身僵 一息坚强 ------ 我一直没有放弃,如果你也能看到 修身 修禅
  • 相关阅读:
    不打无准备之仗,最全868道Java面试题及答案
    准备两个月,面试五分钟,Java岗面试为何越来越难?
    2020JAVA面试必备的26个关键知识点,刷完大厂随便跳
    2020年最全java面试真题解析(980道),你没见过的面试题都在这
    java大厂面试200+(含答案):基础+缓存+网络+分布式....
    判断js中的数据类型的几种方法
    JPG、PNG、GIF、SVG 等格式图片区别
    js闭包
    什么是 js 变量提升 (Javascript Hoisting)
    js函数声明和函数表达式的区别
  • 原文地址:https://www.cnblogs.com/lz2lhy/p/6899379.html
Copyright © 2011-2022 走看看