0
我有一个重点关注并发性和可突发容量的java应用程序。这意味着它使用线程池来排队和执行事件。Java线程创建跟踪
所有这些线程池都是固定大小的,但当应用程序部署在Linux(CentOS 5.5)服务器上时,我总是发现自己碰到了打开的文件描述符限制。
要我计数,应用程序,当负载下,不应在任何一个时间创造超过20个线程,但我创下了1024
ulimit
有什么办法,我可以跟踪这些线程回到创建它们的代码/池?
我有一个重点关注并发性和可突发容量的java应用程序。这意味着它使用线程池来排队和执行事件。Java线程创建跟踪
所有这些线程池都是固定大小的,但当应用程序部署在Linux(CentOS 5.5)服务器上时,我总是发现自己碰到了打开的文件描述符限制。
要我计数,应用程序,当负载下,不应在任何一个时间创造超过20个线程,但我创下了1024
ulimit
有什么办法,我可以跟踪这些线程回到创建它们的代码/池?
一个健全的线程池应至少(可选)允许指定名称。
对于正常的ThreadPoolExecutor
,你需要实现一个ThreadFactory
来适当地命名这些线程。然后使用setThreadFactory()
使它使用你的实现。
您还可以使用GuavaThreadFactoryBuilder
并调用setNameFormat()
获得该功能的预建:
ThreadPoolExecutor myExecutor = ...;
ThreadFactory tf = new ThreadFactoryBuilder().setNameFormat("myExecutorThread-%d").build();
myExecutor.setThreadFactory(tf);
非常有用的,谢谢。我创建了一个简单的'ThreadFactory',它使用一个名字作为它的构造函数,并将问题缩小到第三方库,该库使用了一个无限制的,并且是一个懒洋洋的,如果有的回收线程池。 – Martin 2011-03-14 17:15:43