zoukankan      html  css  js  c++  java
  • 记一次因内存溢出导致的界面卡死的问题

    问题现象:

    启动Tomcat后,10分钟不到界面就卡死,服务器CPU飙高,界面无法访问,现场工程只能通过手动频繁重启Tomcat来应急。

    排查思路:

    1、检查CPU高的原因,见另一篇文章 https://www.cnblogs.com/aligege/p/11448827.html

    2、通过堆栈日志发现,几个CPU占用高的线程全是GC操作,推测出是内存溢出导致的频繁GC

    3、检查内存占用高的对象,结果发现有个日志类占用异常,将近500W个实例。开始找研发沟通日志的使用场景

    jmap -histo:live <PID>  | head -1000

    4、如果上面一步还无法定位到关键信息,那么需要拿到heap dump,生成离线文件,做进一步分析,此过程费时。命令:

    jmap -dump:live,format=b,file=heap.hprof  <PID>  

     

    问题分析:

    经过第3步的分析,已经找到了数量大的对象,联想到某个业务的日志推送场景。通过SQL排查,发现相关数据确实很大。

    问题的因是,日志接收服务挂了,导致堆积了大量的日志。而Tomcat启动后会将这些积压的日志全部加装到内存中等待推送。

     

    解决办法:

    1、日志推送改为小批量推送,一次最多推送1000条;

    2、推送失败后,重试5次,如果还失败,则暂时放弃推送;1小时后再重试

     

     

  • 相关阅读:
    influxdb服务器 relay
    browse-agent type and curl post
    使用 Ansible 管理 MySQL 复制
    ansible里的item和with_items
    Ansible 从MySQL数据库添加或删除用户
    ansibel---tag模块
    ll | wc -l的陷阱
    ansible 判断和循环
    Ansible详解(二)
    Ansible详解(一)
  • 原文地址:https://www.cnblogs.com/aligege/p/13372163.html
Copyright © 2011-2022 走看看