java中的多线程问题

java中的多线程问题,java,multithreading,jms,Java,Multithreading,Jms,我参与了一个使用多线程的项目。该系统是为出租车呼叫中心开发的,每次呼叫大约产生4-5个线程。这里的问题是,在读取JMS队列中的信息后,必须生成一个新线程,而这是不可能发生的。这个问题是随机发生的。我在StackOverflow中被建议进行负载注入 在研究了负载注入之后,我觉得在我的开发服务器中进行测试是不可行的,因为我的系统将通过控制用户访问的调用流进行访问。我花了一些时间研究JVM调优和线程池。大约这个特定的系统进程约为14K-15K个呼叫/天,在高峰时间,队列将非常高,可能会有400-500

我参与了一个使用多线程的项目。该系统是为出租车呼叫中心开发的,每次呼叫大约产生4-5个线程。这里的问题是,在读取JMS队列中的信息后,必须生成一个新线程,而这是不可能发生的。这个问题是随机发生的。我在StackOverflow中被建议进行负载注入

在研究了负载注入之后,我觉得在我的开发服务器中进行测试是不可行的,因为我的系统将通过控制用户访问的调用流进行访问。我花了一些时间研究JVM调优和线程池。大约这个特定的系统进程约为14K-15K个呼叫/天,在高峰时间,队列将非常高,可能会有400-500个呼叫等待在队列中,因为每个呼叫大约需要生成4-5个线程。从日志中我看不到任何类似于on OutOfMemoryError的东西。是否有任何其他原因可能会停止线程的繁殖

我的JVM配置是xms:128m Xmx:1024m 环境是windows server 32位4GB ram

包含threadstacksize是否有助于无障碍地生成线程

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

创建线程是一项非常昂贵的操作,需要占用大量系统资源。最重要的是,默认情况下,每个线程的堆栈512 kB都需要大量内存。如果过度创建新线程,将遇到各种问题。JVM通常只能支持几千个线程,具体取决于操作系统、-XX:ThreadStackSize设置和可用内存


线程池不会使性能变差,它会使性能更好。所以你绝对应该走那条路。如果线程池大小太小,可能会出现一些活动性问题,但这很容易调整。

也许架构中的更改有助于解决问题-我会尝试线程池,因为它的效率很高,但单靠它并不能保证解决问题。您可能需要重新考虑是否真的需要所有生成的线程,让多个线程竞争单个资源是最好的。影响并调整池的大小。看看Executor,它可以帮助您进行一些更改。

操作系统限制您可以同时活动的线程数量并非不可能。不要把这一点放在答案中,因为我不确定这会如何影响JVM,例如,如果JVM做了任何事情来对用户代码隐藏此限制。我肯定会建议使用线程池路线,请参阅我同意u的限制。但是,有没有方法可以发现OS正在处理的活动线程的数量。使用分析器,例如或不能考虑重新构造体系结构,因为这个项目是由其他人开发的。他辞职时我接替了他的职务。现在也在生产中。你看我的问题被卡住了。必须知道如何解决这个问题。