Uma*_*maN 4 java memory performance visualvm jvisualvm
这些事情显然需要仔细检查和提供代码,以便彻底分析并提供好的建议.然而,这并不总是可行的,我希望根据我在下面提供的信息为我提供好的提示.
我有一个服务器应用程序,它使用侦听器线程来侦听传入的数据.传入的数据被解释为特定于应用程序的消息,然后这些消息会引发事件.
到目前为止,我对事情的完成方式并没有任何控制权.
因为这是遗留应用程序,所以这些事件之前由同一个侦听器线程(主要是单线程应用程序)处理.事件被发送到黑盒子,然后输出应该写入磁盘的结果.
为了提高吞吐量,我想使用线程池来处理事件.我们的想法是,每次创建事件时,侦听器线程都可以生成新任务,并且线程将负责黑盒调用.最后,我有一个后台线程执行写入磁盘.
只需使用以前的设置和后台编写器,一切正常,吞吐量比以前增加了1.6倍.
当我添加线程池但性能下降.一开始,一切似乎都运行顺利,但过了一段时间,一切都很慢,最后我得到OutOfMemoryExceptions.奇怪的是,当我每次将一个任务添加到池中时打印活动线程的数量(以及有关排队多少任务的信息等等),看起来好像线程池没有问题跟上producer(监听器线程).
使用top -H检查CPU使用情况,它在开始时非常均匀分布,但最后工作线程几乎没有活动,只有监听器线程处于活动状态.但它似乎没有提交更多任务......
任何人都可以假设这些症状的原因吗?您是否认为遗留代码(我无法控制)中的某些内容更可能在添加多个线程时变坏?内存不足问题应该是因为某个队列某处变得太大,但由于线程池几乎从不包含排队任务,所以不可能.
欢迎任何想法.特别是关于如何更有效地诊断这种情况的想法.如何更好地了解我的线程在做什么等等.
谢谢.
慢下来然后内存不足意味着内存泄漏.
因此,我首先使用一些Java内存分析器工具来确定是否存在泄漏以及泄漏的内容.有时候你很幸运,泄露的物体是众所周知的,很明显谁会挂在他们不应该做的事情上.
| 归档时间: |
|
| 查看次数: |
3498 次 |
| 最近记录: |