Arthas调优实战

131 阅读1分钟

Arthas调优实战

Arthas

  • 官网: arthas.aliyun.com/doc/command…

  • Arthas使用场景

    • 是否有一个全局视角来查看系统的运行状况?
    • 为什么 CPU 又升高了,到底是哪里占用了 CPU ?
    • 运行的多线程有死锁吗?有阻塞吗?
    • 程序运行耗时很长,是哪里耗时比较长呢?如何监测呢?
    • 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
    • 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
    • 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
    • 有什么办法可以监控到 JVM 的实时运行状态?
  • Arthas常用指令

    • dashboard: 查看当前JVM内存使用信息

    • thread

      • thread : 查看某个线程
      • thread -b: 查看线程死锁
    • jad: 反编译代码,这样可以方便我们查看线上代码是否是正确的版本

    • help: 查看手册

    • ognl: 查看或修改线上变量的值

    • heapdump: 类似jmap,可以查看对象占用内存情况

如何分析GC日志

  • 运行程序加上对应的GC日志,但线上服务器运行时间较长,可以滚动打印

    以下参数: 分10个文件打印,每个文件大小100M,超过即覆盖

    -Xloggc:./gc-%t.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps  -XX:+PrintGCTimeStamps -XX:+PrintGCCause  
    -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M
    
  • 注意: JVM内存的设计机制有些是会自动扩容 ,我们尽量将参数的最大值和初始值设置一样,比如内存扩容/缩容就比较耗费性能

    -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M