1次生产环境GC频繁导致接口出现超过问题的排查经过

  1. 机器负载分析
    通过 top 命令分析系统负载,发现 load average = 1.5 左右,但是机器是4核的,所以负载并不高

  2. 找到对应服务进程中使用 cpu 最高的线程

    top -Hp 进程号


    1563936535057.png
  3. 发现 3306 这个线程使用 cpu 高达 88.9%,于是需要分析改线程做了啥

  4. 打印线程栈信息:jstack 进程号 > stack.txt


    1563936564770.png
  5. 找到 3306 的线程栈信息
    将 3306 转换为 16进制(ceb),然后再输出的线程栈文件 stack.txt 找下面的信息,"VM Thread" 是JVM的线程,怀疑是GC 线程。


    1563937807459.png
  6. 分析 GC 详情

    jstat -gcutil 进程号 1000 5(其中1000是每隔1s收集,5是收集次数)

    发现 O(老年代)一直经过 FGC 后没有降多少,还处于高于98%的情景,所以得出老代码的堆内存不够用

    jstat -gcutils 3282 1000 5

    S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 17.46 0.00 100.00 98.68 97.39 95.20 8942 258.342 26486 2041.388 2299.730 30.46 0.00 100.00 98.68 97.39 95.20 8942 258.342 26486 2041.388 2299.730 35.89 0.00 100.00 98.68 97.39 95.20 8942 258.342 26487 2041.431 2299.773 42.65 0.00 100.00 98.68 97.39 95.20 8942 258.342 26488 2041.516 2299.858 51.34 0.00 100.00 98.20 97.39 95.20 8942 258.342 26488 2041.516 2299.858

  7. 增大老年代的堆内存,重启

    以前的配置:-Xmx1536m -Xms1536m -Xmn800m

    更改后的配置:-Xmx1536m -Xms1536m -Xmn512m

你可能感兴趣的:(1次生产环境GC频繁导致接口出现超过问题的排查经过)