zoukankan      html  css  js  c++  java
  • 面试题之使用无界队列的线程池会导致内存飙升吗?

    答案:会;

    分析:

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

    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。

    不积跬步无以至千里不积小流无以成江海
  • 相关阅读:
    最简单的非交互ssh远程执行命令expect脚本
    [转]解决Adobe Reader X中金山词霸不能取词故障
    《TCP/IP Sockets 编程》笔记1
    Visual Studio 2005中无法调试CLR C++的枚举类型
    查找字符串中字符间不同的最大子串
    《C++ Primer》关于自增自减操作符的描述错误
    LVM逻辑卷管理
    《TCP/IP Sockets 编程》笔记2
    《TCP/IP Sockets 编程》笔记7
    Linux文件
  • 原文地址:https://www.cnblogs.com/zhaoyan001/p/10769717.html
Copyright © 2011-2022 走看看