• 面试题之使用无界队列的线程池会导致内存飙升吗?


    答案:会;

    分析:

    创建线程池方式有如下几种:

    Executors.newFixedThreadPool(10);//LinkedBlockingQueue 无限加入队列
    Executors.newScheduledThreadPool(10);//DelayedWorkQueue 队列如果满了,阻塞
    Executors.newSingleThreadScheduledExecutor();//DelayedWorkQueue 队列如果满了,阻塞
    Executors.newCachedThreadPool();//SynchronousQueue 队列如果满了,抛异常
    Executors.newSingleThreadExecutor();//LinkedBlockingQueue 无限加入队列

    jdk7提供了7个阻塞队列,分别是:

    ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列
    LinkedBlockingQueue:一个由链表结构组成的有界阻塞队列
    PriorityBlockingQueue:一个支持优先级排序的无界阻塞队列
    DelayQueue:一个使用优先级队列实现的无界阻塞队列
    SynchronousQueue:一个不存储元素的阻塞队列
    LinkedTransferQueue:一个由链表结构组成的无界阻塞队列
    LinkedBlockingDueue:一个 由链表结构组成的双向阻塞队列

    本文以newFixedThreadPool为例,以下是jdk源码:

    public static ExecutorService newFixedThreadPool(int nThreads) {
            return new ThreadPoolExecutor(nThreads, nThreads,
                                          0L, TimeUnit.MILLISECONDS,
                                          new LinkedBlockingQueue<Runnable>());
        }
    public ThreadPoolExecutor(int corePoolSize,
    int maximumPoolSize,
    long keepAliveTime,
    TimeUnit unit,
    BlockingQueue<Runnable> workQueue) {
    this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
    Executors.defaultThreadFactory(), defaultHandler);
    }
     

    参数说明:

    • corePoolSize:核心线程数
    • maximumPoolSize: 最大线程数
    • keepAliveTime:线程指定时间内获取不到任务,则销毁
    • unit:时间单位
    • workQueue:任务队列

    线程池工作原理图解:

     

    LinkedBlockingQueue默认的最大任务数量是Integer.MAX_VALUE,非常大,可以理解为无限大吧;但是存在这种情况,当每个线程获取到一个任务后,执行时间比较长,导致workQueue里积压的任务越来越多,机器的内存使用不停的飙升,最后也会导致OOM。

  • 相关阅读:
    HTTP、HTTP2
    1-1 用本地代码调试线上环境代码
    js判断触摸方向
    1-1 node 基础
    1-2 nodejs小节 文件读取
    c++ 递归斐波那契算法及时间复杂度
    十进制转换成二进制以 二进制转换成 8进制和16进制
    centos6.5 安装cmake 3.3.2
    回文字符串
    -Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HOME environment variable
  • 原文地址:https://www.cnblogs.com/hujinshui/p/10342897.html
Copyright © 2020-2023  润新知