• 【复盘】记录一次JVM 异常问题 java.lang.OutOfMemoryError: unable to create new native thread


    背景是最新运营提了一个需求,需要根据用户信息拉去三分机构的信贷数据,需要达到一天百万级别,但是经过实际测试,也只能达到40W量级,具体就是通过起多个Spring Boot项目,每个项目1S拉一个用户,基本上一个项目可以拉8W多,5个项目就足够。但是跑了一天发现出现内存使用率过高的问题,并且登录不了机器,所以只能找运维重启。

    具体分析原因如下,可以看到主要是程序的内存使用达到上线。

    	java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: unable to create new native thread
            at java.util.concurrent.FutureTask.report(FutureTask.java:122)
            at java.util.concurrent.FutureTask.get(FutureTask.java:192)
            at finance.CRM.FrameWork.ProcessControl.run(ProcessControl.java:141)
            at finance.CRM.Service.Action.UserDataUpdateAction.upload(UserDataUpdateAction.java:56)
            at sun.reflect.GeneratedMethodAccessor40.invoke(Unknown Source)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:498)
            at 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在分析发现其实内存是一个整体上升的趋势,所以第一步就是先分析代码问题,因为JVM会自动GC处理,不可能这么段时间内,内存上升这么快。CPU整体是毕竟平稳的在25%左右。
    在这里插入图片描述
    经过发现其实有一些空闲对象直接new 并且没有使用,这种情况下 这些对象其实不能被销毁。并且还有一些线程池处理的逻辑,分析之后,发现其实不需要,就删除了。

    查看创建了多少线程
    jstack -l 22681 | grep ‘java.lang.Thread.State’ | wc -l

    查看限制数 ulimit -u

    查看当前进程运行线程数
    pstree -p pid | wc -l
    jstack -F PID 堆栈

    通过分析,进程是正常的基本维持在几十个线程之间,并且使用Arthas 也分析了线程和JVM的GC 发现是正常的,所以没有问题了。

    链接:
    https://arthas.aliyun.com/doc/quick-start.html
    https://www.cnblogs.com/zjfjava/p/17016083.html

  • 相关阅读:
    2021 华数杯全国大学生数学建模竞赛C题-电动汽车目标客户销售策略研究(一)(附带赛题解析&获奖论文及Python代码)
    Git全家桶及其常用命令
    Mysql锁--mysql详解(十二)
    Swagger学习
    Windows上搭建一个网站(基本生产环境)
    酷开科技丨大屏购物买买买,酷开系统助力网购模式再升级
    问题与分类
    【MySQL进阶】深入理解InnoDB记录结构
    bug场景记录
    漏斗分析法、假设分析法
  • 原文地址:https://blog.csdn.net/jia970426/article/details/134217888