我参与了一个使用多线程的项目。每个呼叫都会产生大约4-5个线程(该系统是为出租车呼叫中心开发的)。这里的问题是,在读取JMS队列中的信息之后,一个新线程必须生成没有发生的新线程。这个问题是随机发生的。我在earlier posted similar question in StackOverflow,在那里我被建议做负载注入。
在研究了负载注入之后,我觉得在我的开发服务器上进行测试是不可行的,因为我的系统将从控制用户访问的调用流中访问。我花了一些时间研究JVM调优和线程池。大约这个特定的系统进程大约是14K-15K /天,在高峰时间它的队列将非常高(可能会达到400-500个等待队列中的呼叫),因为每个调用都必须生成大约4-5个线程。从日志中,我在OutOfMemoryError上看不到任何类似的东西。还有其他原因可以阻止线程的产生吗?
我的JVM conf是xms:128 My :1024m是windows服务器32位,4GB内存。
包括线程堆栈大小将有助于在没有任何障碍的情况下生成线程?
我还在研究线程池的可行性。在生成固定数量的线程时,我需要研究它是否会影响系统的整体性能?
发布于 2011-10-11 08:31:41
创建线程是一个非常昂贵的操作,并且使用了大量的系统资源。最重要的是,每个线程的堆栈需要大量内存(默认为512个kB )。如果过度创建新线程,则会遇到各种问题。JVM通常只能支持几千个线程,具体取决于操作系统、-XX:ThreadStackSize
设置和空闲内存。
线程池不会使性能变差,它会使性能更好。所以你绝对应该往那边走。如果您的线程池大小太小,您可能会遇到一些活动问题,但这很容易调整。
发布于 2011-10-11 08:59:13
也许架构的改变可以帮助解决问题--我会尝试线程池,因为它的效率很高,但单靠它并不能保证解决问题。如果所有生成的线程都确实需要,则可能需要重新考虑(让多个线程竞争单个资源是perf )。和调整池的大小()。看看Executor,它可以帮助您进行一些更改。
https://stackoverflow.com/questions/7723143
复制相似问题