ExecutorService的OOM坑

探讨了Java中ExecutorService的不同创建方式及默认配置可能导致的问题。推荐使用ThreadPoolExecutor以更好地控制线程池和任务队列。

ExecutorService有下面几种创建方式

                   Executors.newCachedThreadPool();

                   Executors.newFixedThreadPool()

                   Executors.newScheduledThreadPool()

                   Executors.newSingleThreadExecutor()

                   Executors.newSingleThreadScheduledExecutor()

抽取其中一个方法查看源码:

publicstatic ExecutorService newFixedThreadPool(int nThreads) {

    return new ThreadPoolExecutor(nThreads,nThreads,

                                  0L, TimeUnit.MILLISECONDS,

                                  newLinkedBlockingQueue<Runnable>());

}

   /**

     * Creates a {@code LinkedBlockingQueue}with a capacity of

     * {@link Integer#MAX_VALUE}.

     */

   publicLinkedBlockingQueue(){

        this(Integer.MAX_VALUE);

    }

 

   /**

     * A constant holding the maximum value an{@code int} can

     * have, 2<sup>31</sup>-1.

     */

    public static final int   MAX_VALUE = 0x7fffffff;

 

 

由上面的方法参数知道,Executors创建的ExecutorService并不能设置控制消息队列的长列,默认长度是2^31当线程处理速度较慢且并发任务太多时,任务队列的任务将不断堆积,就可能引起OOM。因此建议直接

 

ThreadPoolExecutor executor = new TThreadPoolExecutor(int corePoolSize,

                              intmaximumPoolSize,

                              longkeepAliveTime,

                              TimeUnit unit,

                             BlockingQueue<Runnable> workQueue)

这样就可以灵活定制队列,建议使用new ThreadPoolExecutor。

 


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值