我正在使用 ThreadPoolExecutor。我创建了一个新的 CRIRunnerThreads 并在最后一个完成后将它们一遍又一遍地提交给 CRIThreadPool。我担心的是,如果您查看第二段代码,我会在该过程完成后让记录器显示 ThreadAllocatedBytes。在过程开始时,我看到如下输出:
2013-06-27 [pool-1-thread-1] ThreadAllocatedBytes:416.7 MB (INFO)
在运行结束时,我看到
2013-06-28 [pool-1-thread-1] ThreadAllocatedBytes:4.5 GB (INFO)
当它达到 4GB 时,我可能已经提交并完成了 400 个 CRIRunnerThread
我假设(这就是我在这里要问的),ThreadPoolExecutor 中的线程越来越大,并且永远不会回收/CG;g?
这是一个正确的假设吗?一旦线程/工作者完成,我应该做些什么吗?
还是我错误地使用了 ThreadMXBean?
public CRIThreadPool(int corePoolSize, int maximumPoolSize,
long keepAliveTime, TimeUnit unit,
BlockingQueue<Runnable> workQueue) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
FutureObjs = Collections.synchronizedMap( new HashMap<Future, Thread>() );
}
我的 corePoolSize 是 2,maximumPoolSize 是 4(这是一个小型开发箱)
在我的线程中我有
public class CRIRunnerThread extends Thread {
public void run() {
//instantiates a class and call a long running process
//when complete display the threadAllocatedBytes
com.sun.management.ThreadMXBean tBean =
(com.sun.management.ThreadMXBean) ManagementFactory.getThreadMXBean();
long bytes = tBean.getThreadAllocatedBytes(Thread.currentThread().getId());
logger.info(("(" + mrn + ")ThreadAllocatedBytes:" +
FormUtils.humanReadableByteCount(bytes, true)));
}
}