• 【复盘】记录一次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

  • 相关阅读:
    5 年 Python ,总结的 10 条 Python 使用技巧
    2024-05-30 vscode python不能调试
    ubuntu20.04卸载cuda11.4重装cuda11.0
    力扣 hot100 -- 技巧
    【gpt实践】50个提升工作效率的GPT指令
    Unix后记&寻找Shen Lin
    ClickHouse Senior Course Ⅱ
    IDEA本地将镜像推送到coding制品仓库
    文件IO和标准IO的区别
    24、Linux网络端口
  • 原文地址:https://blog.csdn.net/jia970426/article/details/134217888