先说结论:
-
如果线程池中有核心线程,且是核心线程不会在空闲时被回收(默认allowCoreThreadTimeOut=false)
那么就会导致核心线程一直阻塞在获取任务上,该核心线程不会结束,GC也不会回收,很可能会导致内存溢出.
同时也会导致其他系统资源浪费,因为那些核心线程都在获取任务时阻塞着. -
反之,如果线程池没有核心线程,或者线程池设置了核心线程可以在空闲时被回收,
- 并且线程池的keepalive不是太长那么没用的线程会被及时回收掉,不会内存溢出.
- 如果keepalive时间较长,导致无用线程不能及时被回收,会OOM.
但是无论哪种情况都会导致一定程度的资源浪费,所以线程池不用的时候一定要terminate它.
下面是测试例子:
static void executorTest() throws Exception {
//用于获取到本java进程,进而获取总线程数
RuntimeMXBean runtimeBean = ManagementFactory.getRuntimeMXBean();
String jvmName = runtimeBean.getName();
System