0

我正在使用 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)));
     }

}
4

0 回答 0