为方便自己查看,根据工作遇到的问题,转载并整理以下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等等。

记一次jvm异常排查及优化的更多相关文章

  1. 记一次用arthas排查jvm中CPU占用过高问题

    记一次使用arthas排查jvm中CPU占用过高问题.这工具屌爆了 碾压我目前使用的全部JVM工具. 安装 小试 curl -O https://arthas.aliyun.com/arthas-bo ...

  2. JVM笔记10-性能优化之高级特性

    一.垃圾回收器配置和 GC 日志分析 1.堆典型配置: 32位的操作系统限制堆大小介于1.5G到2G,64位操作系统无限制,同时系统可用虚拟内存和可用物理内存都会限制最大堆的配置. 堆空间分配典型配置 ...

  3. java多线程02-----------------synchronized底层实现及JVM对synchronized的优化

    java多线程02-----------------synchronized底层实现及JVM对synchronized的优化 提到java多线程,我们首先想到的就是synchronized关键字,它在 ...

  4. 记一次NoHttpResponseException问题排查

    上传文件程序会有一定的概率提示错误,错误率大概在1%以下,错误信息是:org.apache.http.NoHttpResponseException , s3-us-west-1.amazonaws. ...

  5. 解Bug之路-记一次JVM堆外内存泄露Bug的查找

    解Bug之路-记一次JVM堆外内存泄露Bug的查找 前言 JVM的堆外内存泄露的定位一直是个比较棘手的问题.此次的Bug查找从堆内内存的泄露反推出堆外内存,同时对物理内存的使用做了定量的分析,从而实锤 ...

  6. 坑爹坑娘坑祖宗的87端口(记一次tomcat故障排查)

    原贴如下 坑爹坑娘坑祖宗的87端口(记一次tomcat故障排查) 虽然我用的是PHPstudy部署的dedecms,还是一样栽倒这个坑里了. 总结经验:本地测试使用8000~9000的端口比较安全.

  7. JVM性能分析与优化

    JVM性能分析与优化: http://www.docin.com/p-757199232.html

  8. Spark Tungsten揭秘 Day1 jvm下的性能优化

    Spark Tungsten揭秘 Day1 jvm下的性能优化 今天开始谈下Tungsten,首先我们需要了解下其背后是符合了什么样的规律. jvm对分布式天生支持 整个Spark分布式系统是建立在分 ...

  9. redis 异常排查

    异常排查 redis-server redis.windows.conf D:\redis-2.8.17>redis-server.exe redis.windows.conf[4692] 27 ...

随机推荐

  1. BZOJ1021 [SHOI2008]循环的债务

    Description Alice.Bob和Cynthia总是为他们之间混乱的债务而烦恼,终于有一天,他们决定坐下来一起解决这个问题. 不过,鉴别钞票的真伪是一件很麻烦的事情,于是他们决定要在清还债务 ...

  2. Java常见异常类

    NullpointException(空指针异常)ClassNotFoundException(类找不到异常)ClassCastException(类型转换异常)IllegalArgumentExce ...

  3. css中元素的auto属性值是什么意思,比如margin:0 auto表示什么?

    auto 你可以理解为一种 自动/自适应 的概念 比如 现在项目需要一个宽度为960px的整体布局居中 根据用户浏览器大小不同你将需要使用margin:0 auto;来实现. 无论用户浏览器宽度为多少 ...

  4. 关于修改bug的思考

     作者:朱金灿 来源:http://blog.csdn.net/clever101 有软件就有bug,这意味着软件研发不仅仅是新功能开发,更要拿出相当一部分精力去修改bug.但基本很多软件开发者并 ...

  5. 使用nodeJs安装Vue-cli (win10 使用管理员身份)

    TIP:win10下安装,使用管理员身份进行,否则会有权限限制. 1,安装完成node,node有自带的npm,可以直接在cmd中,找到nodeJs安装的路径下,进行命令行全局安装vue-cli.(n ...

  6. ESP8266调试记录

    1.引脚图:使用STM32F103ZET6芯片的串口1  PA9-TX //PA10-RX(该串口挂载到APB2总线时钟)然后分别连接模块的RX和TX,供电使用3.3v(供电一定要稳)但不能超过5v ...

  7. spring+quarts常见问题

    javax/transaction/UserTransactionCaused by: java.lang.NoClassDefFoundError: javax/transaction/UserTr ...

  8. IT之路如何走得更远

    作者:石头2075链接:http://www.jianshu.com/p/8c6417e16505著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 首先,你需要在合适的年纪进入了这 ...

  9. windows系统镜像 微软官方资源便捷下载教程

    今天跟小师弟学到了一个下载软件的好办法,省得到各种网站下载带有病毒,插件的资源. 这个神奇的网站叫做   MSDN, 我告诉你,这是一个私人维护的网站,里面有各种官方软件的下载地址.可以直接用下载工具 ...

  10. 彻底解密 Spark 的 HashShuffle

    本课主题 Shuffle 是分布式系统的天敌 Spark HashShuffle介绍 Spark Consolidated HashShuffle介绍 Shuffle 是如何成为 Spark 性能杀手 ...