使用Apache Mina时出现outOfMemory错误
问题:我这边是用mina开发的服务器端程序,处理客户发送过来的交易,在用LoadRunner进行压力测试时发现并发在100时,1个小时后就会出现内存溢出。
主要代码:
1、线程池:
acceptor.getFilterChain().addLast("threadPool", new ExecutorFilter(10,100));
2、虚拟机参数:
-server -Xms1g -Xmx1g -Xmn256k -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=2
3、机器配置:
CPU:e8400 双核
内存:2G
问题分析:
使用jprofiler分析发现,系统启动20分钟后,内存使用量达到99%,当然loadrunner此时一直在运行,再过一会内存溢出。
jprofiler发现占用内存最多的地方是java.util.concurrent.ThreadPoolExecutor$Worker.run,也就是说占用内存最多的地方是线程。
疑问:
为何线程会占用这么多的内存,而且不会GC?是不是程序有什么问题?现在没有头绪,请各位帮忙解答,谢谢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
好久没来这里了,我提的这个问题早就解决了,原因是handler在获取数据库连接时居然用了单例模式,因为数据库处理这一块是沿用以前的代码,所以导致数据库连接很快用完,也导致了后面的很多请求无法处理完毕,所以也无法发送Response,也因此导致了内存很快用完。程序从上线到现在从未更新过也未出现过任何故障,也许和我们的交易量小有关系吧。
目前比较有时间,并且Mina很久未更新,所以打算开始Netty的学习。
看来我对NIO的了解还不够,总是以为线程越多越好,打算把线程数修改小一些试试看。多谢各位。
另外,我使用的是mina 2.0.
......通过使用NIO 工具包进行并发型服务器程序设计,一个或者很少几个Socket 线程就可以处理成千上万个活动的Socket 连接,大大降低了服务器端程序的开销;同时网络I/O 采取非阻塞模式,线程不再在读或写时阻塞,操作系统可以更流畅的读写数据并可以更有效地向CPU 传递数据进行处理,以便更有效地提高系统的性能。
其实我是来问问题的,你是用的MINA2.0吗?
你增加了线程配置:acceptor.getFilterChain().addLast("threadPool", new ExecutorFilter(10,100));
会不会为每个登录的客户端分配一个线程?