2011-10-11 59 views
0

我参与了使用多线程的项目。每次通话都会产生4-5个线程(该系统是为出租车呼叫中心开发的)。这里的问题是,在阅读JMS队列中的信息之后,一个新的线程必须产生,这不会发生。此问题随机发生。我建议在StackOverflow中使用I earlier posted similar question进行加载注入。java中的多线程问题

在研究了加载注入之后,我认为,在我的开发服务器中进行测试是不可行的,因为我的系统将通过控制用户访问的调用流进行访问。我花了一些时间研究JVM调优和线程池。对于这个特定的系统进程,大约每天14K-15K次呼叫,在高峰时间内,队列将会非常高(可能会在队列中等待400-500个呼叫),每次调用4-5个线程都必须产生。从日志中我没有看到OutOfMemoryError之类的东西。 有没有其他的原因可能会阻止线程的产卵?

我的JVM conf是xms:128m Xmx:1024m 环境是windows server 32bit,4GB ram。

将包括threadstacksize帮助产卵的线程没有任何障碍?

我也在研究线程池的可行性。在产生固定数量的线程时,我需要研究它是否会影响系统的整体性能?

+0

操作系统限制可以同时激活的线程数并不是不可能的。不把它放在答案中,因为我不确定这是如何影响JVM的(例如,如果他们做了任何事情来隐藏用户代码的限制)。 – Romain

+0

我肯定会推荐使用线程池路由,请参阅http://download.oracle.com/javase/6/docs/api/java/util/concurrent/Executors.html#newFixedThreadPool(int) – Qwerky

回答

0

创建一个线程是一个非常昂贵的操作并使用了大量的系统资源。最重要的是每个线程都需要大量内存(默认情况下为512 kB)。如果你过分地创建新线程,你会遇到各种各样的问题。 JVM通常只能支持几千个线程,具体取决于操作系统,-XX:ThreadStackSize设置和可用内存。

线程池不会让你的性能变差,它会使它变得更好。所以你绝对应该这样。如果你的线程池太小,你可能会遇到一些生存问题,但这很容易调整。

+0

我同意你的意见关于限制。但是,有什么方法可以找出操作系统正在处理的活动线程数量。 – AKV

+0

使用分析器,例如[JProfiler](http://www.ej-technologies.com/products/jprofiler/overview.html)或[visualvm](http://visualvm.java.net/) –

0

也许体系结构的变化可以帮助解决问题 - 我会尝试线程池,因为它的效率很高,但单靠它并不能保证解决问题。如果确实需要所有衍生的线程,则需要重新考虑(具有多个线程竞争单个资源的性能影响),并且调整池的大小。看看Executor,它可以帮助你做一些改变。

+0

无法考虑因为这个项目是由其他人开发的,所以重新构建了架构。他辞职时我接管了他。现在还在生产。 ü看到我的问题卡住了一些。必须有一些如何解决这个问题。 – AKV