zoukankan      html  css  js  c++  java
  • 记一次jvm异常排查及优化

       为方便自己查看,根据工作遇到的问题,转载并整理以下jvm优化内容

      有次接到客服反馈,生产系统异常,无法访问。接到通知紧急上后台跟踪,查看了数据库死锁情况--正常,接着查看tomcat 内存溢出--正常,再去跟踪流量--正常。没折了,把生产系统重起,刚开始几分钟,监控显示一切正常,过几分钟情况恢复正常。再去检查apache代理机,发现代理机长时间没有返回造成阻塞宕机。问题由此确定。接着查看了xxx.com/proxoolAdmin?alias=ec&tab=snapshot 数据连接池情况,发现连接池爆满了。再次验证了生产系统存在长时间处理的业务。

      从这个问题反映出,生产系统上压力测试存在问题,基本的压力测试流程没有,同时通过这次排查异常也暴露了自己本身在jvm异常优化方面经验缺失。

      接下来狠狠的给自己补齐这门jvm优化的相关知识。调优的目的是保持jvm稳定,而不是提高tqs等4个9的参数指标。

    调整jvm内存等关键信息

      配置tomcat调用的虚拟机内存大小

      (1)直接设置tomcat

        Linux

        修改TOMCAT_HOME/bin/catalina.sh 
        位置cygwin=false前。
        JAVA_OPTS="-server -Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128m" (仅做参考,具体数值根据自己的电脑内存配置)

        windows

        修改TOMCAT_HOME/bin/catalina.bat 
        第一行加上
        JAVA_OPTS="-server -Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128m" 、

        最大内存数最好不要超过系统内存是一半,一半设置为三分之一的较好。各个参数参照比例设置基本问题不大。

      (2)配置环境变量

        环境变量中设     变量名:JAVA_OPTS     变量值:-Xms512m   -Xmx512m

    排查jvm异常主要包括内存使用情况,使用jstat 统计gc。死锁情况,所以需要定位到具体类,jstack  可以查看死锁。

    统计gc信息

       jstat -class pid:显示加载class的数量,及所占空间等信息。

        jstat -compiler pid:显示VM实时编译的数量等信息。
        jstat -gc pid:可以显示gc的信息,查看gc的次数,及时间。其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。
        jstat -gccapacity:可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。其他的可以根据这个类推, OC是old内纯的占用量。
        jstat -gcnew pid:new对象的信息。
        jstat -gcnewcapacity pid:new对象的信息及其占用量。
        jstat -gcold pid:old对象的信息。
        jstat -gcoldcapacity pid:old对象的信息及其占用量。
        jstat -gcpermcapacity pid: perm对象的信息及其占用量。
        jstat -util pid:统计gc信息统计。
        jstat -printcompilation pid:当前VM执行的信息。

    各列意义

      S0C:年轻代中第一个存活区的大小
      S1C:年轻代中第二个存活区的大小
      S0U:年轻代中第一个存活区已使用的空间 (KB) 
      S1U:年轻代中第二个存活区已使用的空间 (KB) 
      EC:   Edem区大小
      EU:   年轻代中Edem区已使用的空间 (KB) 
      OC:  老年代大小
      OU:  老年代已使用的空间 (KB) 
      PC:   持久代大小
      PU: 持久代已使用的空间 (KB) 
      YGC: 从应用程序启动到采样时young gc的次数
      YGCT: 从应用程序启动到采样时young gc的所用的时间(s)
      FGC:  从应用程序启动到采样时full gc的次数
      FGCT: 从应用程序启动到采样时full gc的所用的时间
      GCT: 从应用程序启动到采样时整个gc所用的时间
      说明:YGCT 时间越短越好

    频繁GC问题或内存溢出问题

      一、使用jps查看线程ID

      二、使用jstat -gc 3331 250 20 查看gc情况,一般比较关注PERM区的情况,查看GC的增长情况。

      三、使用jstat -gccause:额外输出上次GC原因

      四、使用jmap -dump:format=b,file=heapDump 3331生成堆转储文件

      五、使用jhat或者可视化工具(Eclipse Memory Analyzer 、IBM HeapAnalyzer)分析堆情况。

      六、结合代码解决内存溢出或泄露问题。

    死锁问题

      使用jstack -F pid

    常用的压力测试工具及命令

      loadrunner,jmeter,tcpcopy

           tcpcopy是拷贝线上流量,对于已有接口和服务做压力测试是个神器,jmeter和loadrunner是压力测试工具,loandrunner压测结果更详细可视化不过笨重收费而且需要很多客户机,jmeter相对是平民版的loadrunner,胜在免费。

           jmap,jstack,jstat。jstat查看内存回收概况,实时查看各个分区的分配回收情况,jmap查看内存栈,查看内存中对象占用大小,jstack查看线程栈,死锁,性能瓶颈,某个线程使用cpu过高导致服务整体慢等都可以通过在这些命令辅助Linux命令看出来。

    top,vmstat,sar,dstat,traceroute,ping,nc,netstat,tcpdump,ss等等。

  • 相关阅读:
    oracle在没
    一天中时针和分钟重合的次数
    oracle的隐藏的东东
    左右小移动
    JS全选的操作
    JS定时器
    在文件中查找字符串
    表单原件
    div和span互换
    div和span的区别
  • 原文地址:https://www.cnblogs.com/ai88/p/10442578.html
Copyright © 2011-2022 走看看