2012-03-16 96 views
3

我使用一个线程池,应该是能够执行数百个并行任务。然而,这些任务通常只执行很少的计算,并且大部分时间都花在等待某些服务器响应上。因此,如果线程池大小包含数百个线程,则只有少数线程处于活动状态,而大多数线程将等待。线程池与许多阻塞任务

我知道,一般这不是线程池使用一个很好的做法,但目前的设计不允许做我的任务异步,使他们能够无需等待服务器的响应返回控制。所以考虑到这个限制,我想我最大的问题是线程堆栈空间的内存消耗增加。

那么,有没有办法用某种轻量线程不会占用多少内存?

我现在有一个JVM选项-Xss来控制堆栈内存,但似乎没有办法控制每个线程池或线程,而不是改变VM内的所有线程,对吗?

而且你有一个更好的解决我的问题有什么建议?

+0

从我所了解的这个线程执行网络通信? – 2012-03-16 13:39:34

+0

是的,但不幸的是我没有通信层的低级控制。 – Lobachevsky 2012-03-19 15:05:08

+0

只需注意:如果线程的总数实际上受到关注,则缓存的缓冲池似乎非常适合您的用例。高速缓存将允许在活动高峰时重新使用线程,并且生存时间将允许它们在给定的时间量之后停止(从而释放资源)。这可以缓解这些问题(如果你真的有一个,例如1000个线程在典型的当前硬件上是完美的)。 – GPI 2017-08-10 14:21:36

回答

2

我知道,一般这不是线程池的使用

我不同意一个好的做法。我认为这是一个完美的做法。您是否看到这种方法存在问题,因为否则,从标准线程切换,过早优化到我?

那么有没有什么方法可以使用某种轻量级的线程,不占用太多内存?

我想你已经在那里了。线程已经相对轻量级了,除非你在一个非常有限的JVM中工作,否则我没有理由担心其中的数百个线程。

你也有任何建议,以更好地解决我的问题?

的任何解决方案,我看到的将是一个很多更加复杂,并会再次过早优化的定义。例如,您可以使用NIO并在服务器响应可用时执行您自己的线程调度,但这是您可以通过线程免费获得的事情。

+0

>我不同意。我认为这是一个完美的做法。你看到这种方法的问题,因为这对我来说过早优化? – Lobachevsky 2012-03-19 14:49:47

+0

(请忽略我上面的评论,这是错误的)我还没有观察到任何真正的问题,但我看到通常我的线程池有大约500个线程,一次只有一个或两个线程处于活动状态。现在我需要增加线程池的限制,可能超过1000,所以我很担心内存开销。 – Lobachevsky 2012-03-19 14:59:02

+0

您可以通过点击X @ Kostadin来杀死该评论。如果你发现记忆有问题,或者怀疑发生抖动,那么我会处理它。一个好的分析器也会告诉你,如果你有问题。我在测试中创建了2k个线程,占用了<3mb的内存,所以线程的数量不应该成为问题。 – Gray 2012-03-19 15:04:11

1

那么有没有什么方法可以使用某种轻量级线程,而不会消耗太多内存?

在线程池中使用普通线程很可能重量轻。

我现在有一个JVM选项-Xss控制堆栈内存,但它似乎没有办法来控制这种每线程池或仅线程,而不是改变它的虚拟机中的所有线程,对不对?

这是每个线程的最大尺寸。它的大小,你想要得到一个StackOverFlowError而不是继续运行。恕我直言,没有什么好处在每个线程的基础上进行调整。

线程堆栈使用主存储器实际使用的部分和其余的虚拟内存。如果您有64位JVM,虚拟内存便宜。如果这是一个问题,我会切换到64位。

你也有任何建议,以更好地解决我的问题?

如果您有数千个线程,您可能会考虑使用非阻塞IO。听起来你不需要担心。在我所做的测试中,拥有10,000个活动线程会占用一个CPU(如果线程无法执行任何操作)对于每百个线程,您可能会浪费1%的CPU。如果您有空闲的CPU,这不太可能是个问题。

+0

好的,在这种情况下,我会做一些增加线程池大小的测试,看看是否有任何问题。我没有注意到-Xss只是最大尺寸。那应该没问题。 – Lobachevsky 2012-03-19 15:02:55