使用TimeLimitedCodeBlock循环时,Java中的线程池数量过多

时间:2015-09-21 02:58:28

标签: java multithreading threadpool

我编写了一个似乎运行良好的Java程序,但是当我检查Mac上的Activity Monitor的内存选项卡时,我看到了" Ports"与Java VM相关联的数量巨大,目前大约有49,000个,并且在我使用该程序时稳步上升。我不确定这是否是一个问题,但鉴于活动监视器中列出的其他程序往往具有少得多的端口(少于1000个),并且这些数字似乎不会持续上升,我担心我的程序会留下一些垃圾,最终会导致问题。

到目前为止,

故障排除已将增加端口数的源隔离到在此示例后面的TimeLimitedCode块内执行的代码: Java: set timeout on a certain block of code?

每次代码循环遍历TimeLimited块时,它都会创建一个新的线程池,如下面从示例程序中粘贴的输出所示,该示例程序几乎与链接中的一个相同。你可以看到每次循环时池数从pool-1增加到pool-2等等。

在我的实际程序中,线程池计数很快就会达到成千上万,这在我的Mac活动监视器中显示为与Java VM相关的大量端口...目前约为49,000。 Mac活动监视器指南描述了这些"端口"这样:

" ports"列显示了多少" Mach端口"或"内核队列"该过程已经打开,它基本上描述了该过程与其他人的交流方式(即:从系统中保留内存使用情况)。

这告诉我,所有这些端口都在消耗一些需要以某种方式释放的系统资源。但我真的不知道从哪里开始 - 会感谢评论1)我的"问题"真的是一个,2)我应该做什么样的故障排除来追查根本原因。

感谢。

    0ms [            main] calling runWithTimeout!
   53ms [ pool-1-thread-1] starting sleep!
 1055ms [            main] got timeout!
 1055ms [ pool-1-thread-1] was interrupted!
 1055ms [            main] end of main method!
 1055ms [            main] calling runWithTimeout!
 1056ms [ pool-2-thread-1] starting sleep!
 2061ms [            main] got timeout!
 2061ms [            main] end of main method!
 2061ms [            main] calling runWithTimeout!
 2061ms [ pool-2-thread-1] was interrupted!
 2061ms [ pool-3-thread-1] starting sleep!
 3063ms [            main] got timeout!
 3063ms [            main] end of main method!
 3064ms [            main] calling runWithTimeout!
 3063ms [ pool-3-thread-1] was interrupted!
 3064ms [ pool-4-thread-1] starting sleep!
 4068ms [            main] got timeout!
 4068ms [ pool-4-thread-1] was interrupted!

0 个答案:

没有答案