• JVM CPU打满问题定位


    1.线程不释放,导致Old区占满,系统不停的FullGC

    发现应用并没有在进行FGC,而是进行频繁的YGC。

    YGC也存在异常,S1和S0区域都是从0直接跳到99%

    观察堆大小装太发现Young区内存都是不断的从0到99,而Old区在慢慢递增,还未达到FGC的状态。但预计后续会不停的上涨,导致FGC频道,应用无法提供服务。

    在发现YGC频繁之后大约3个小时,终于开始了频繁的FGC,Old区满。

    以下是堆大小和FGC的情况:

    可以看到差不多10秒钟Old区就用满了导致一次FGC,而且Old区大小是10G(多么恐怖,10个G十来秒就用完了)

     查完内存的状态确认并不是old区太小,被用满了导致了不停的FGC,因为old明显是够大的,如果10G不够,那应用肯定是有问题的。

    查看进程的线程CPU使用情况:

    top:查出较高的进程号

    top -H -p 查出的进程号,显示出所有的线程!再按CPU排序,如下图

    拿到CPU占用较高的几个线程,转成16进制

    使用jstack看进程内的线程堆栈信息(jstack 24820 > abc.log)

    vim编辑abc.log,查找上面获取到的线程的16进制数

    如果有多个用户同时进行多个查询(一个用户也可以进行多次查询),就会出现多个线程多次SSH的情况。

    2.多线程操作线程不安全变量

    比如多线程操作HashMap

  • 相关阅读:
    Docker安装以及运行第一个HelloWorld
    logstash-配置文件详解
    oh my zsh 常用插件
    Linux之Shell基本命令
    Linux的基本命令
    Vue
    rest_framwork之认证组件,权限组件,频率组件
    rest_framwork之序列化组件
    rest_framwork之APIView
    中间件
  • 原文地址:https://www.cnblogs.com/zhulongchao/p/4731382.html
Copyright © 2020-2023  润新知