JAVA如何使用线程池?
1、将堆内存调整到10M:-Xms10m -Xmx10m

1、Executors下面的newFixedThreadPool、newSingleThreadExecutor和newWorkStealingPool方法,都可能由于启动的线程过少,而任务却是一个又一个丢到队列中,导致内存溢出。
2、下面就是调用newFixedThreadPool,运行内存溢出的代码。
ExecutorService threadPool = Executors.newFixedThreadPool(4);
for (int i = 0; i < Integer.MAX_VALUE; i++) {
threadPool.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
});
}

1、Executors下面的newCachedThreadPool和newScheduledThreadPool方法,可能由于创建过多的线程造成内存溢出。
2、下面就是调用newCachedThreadPool,运行内存溢出的代码。
ExecutorService threadPool = Executors.newCachedThreadPool();
for (int i = 0; i < Integer.MAX_VALUE; i++) {
threadPool.execute(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
});
}

1、针对newFixedThreadPool,引起内存溢出是因为LinkedBlockingQueue参数,因为LinkedBlockingQueue是长度为Integer.MAX_VALUE的队列,可以认为是无界队列,因此往队列中可以插入无限多的任务,在资源有限的时候容易引起OOM异常。
因而可以重写newFixedThreadPool方法,重新实现LinkedBlockingQueue,将里面的队列长度限定到合理范围。

2、针对newCachedThreadPool,引起内存溢出是因为定义的线程池最大数量是Integer.MAX_VALUE。在任务比较耗时的时候,线程不能很快的复用,从而导致不断创建新的线程消耗资源,甚至引起OOM异常。
因而可以重写newCachedThreadPool,将线程池最大数量限定到合理范围,从而避免OOM的出现。

3、其他Executors方法也可以参照上面修改。