zoukankan      html  css  js  c++  java
  • springboot-@Async默认线程池导致OOM问题

    内存溢出的三种类型:

    • 第一种OutOfMemoryError: PermGen space,发生这种问题的原意是程序中使用了大量的jar或class
    • 第二种OutOfMemoryError: Java heap space,发生这种问题的原因是java虚拟机创建的对象太多
    • 第三种OutOfMemoryError:unable to create new native thread,创建线程数量太多,占用内存过大

    初步分析:

    初步怀疑是线程创建太多导致,使用jstack 线程号 > /tmp/oom.log将应用的线程信息打印出来。查看oom.log,发现大量线程处于Runnable状态,基本可以确认是线程创建太多了。
    

    代码分析:

    1.出问题的微服务是日志写库服务,对比日志,锁定在writeLog方法上,wirteLog方法使用spring-@Async注解,写库操作采用的是异步写入方式。
    2.之前没有对@Async注解深入研究过,只是知道可以自定义内部线程池,经查看,日志写库服务并未自定义异步配置,使用的是spring-@Async默认异步配置
    3.网上提到@Async默认异步配置使用的是SimpleAsyncTaskExecutor,该线程池默认来一个任务创建一个线程,在压测情况下,会有大量写库请求进入日志写库服务,这时就会不断创建大量线程,极有可能压爆服务器内存。
    

    最终解决办法:

    1.自定义线程池,使用LinkedBlockingQueue阻塞队列来限定线程池的上限
    2.定义拒绝策略,如果队列满了,则拒绝处理该任务,打印日志,代码如下:
    
    定位问题原因* 根据原因思考问题解决方案* 实践验证方案有效性* 提交验证结果
  • 相关阅读:
    494 Target Sum 目标和
    493 Reverse Pairs 翻转对
    492 Construct the Rectangle 构建矩形
    491 Increasing Subsequences 递增子序列
    488 Zuma Game 祖玛游戏
    486 Predict the Winner 预测赢家
    485 Max Consecutive Ones 最大连续1的个数
    483 Smallest Good Base
    Django Form组件
    Django Auth组件
  • 原文地址:https://www.cnblogs.com/jimoliunian/p/13739370.html
Copyright © 2011-2022 走看看