5
回答
使用Apache Mina时出现outOfMemory错误
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

问题:我这边是用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?是不是程序有什么问题?现在没有头绪,请各位帮忙解答,谢谢

举报
dafei
发帖于7年前 5回/2K+阅
共有5个答案 最后回答: 3年前

其实我是来问问题的,你是用的MINA2.0吗?

你增加了线程配置:acceptor.getFilterChain().addLast("threadPool", new ExecutorFilter(10,100));

会不会为每个登录的客户端分配一个线程?

......通过使用NIO 工具包进行并发型服务器程序设计,一个或者很少几个Socket 线程就可以处理成千上万个活动的Socket 连接,大大降低了服务器端程序的开销;同时网络I/O 采取非阻塞模式,线程不再在读或写时阻塞,操作系统可以更流畅的读写数据并可以更有效地向CPU 传递数据进行处理,以便更有效地提高系统的性能。

 

看来我对NIO的了解还不够,总是以为线程越多越好,打算把线程数修改小一些试试看。多谢各位。

另外,我使用的是mina 2.0.

好久没来这里了,我提的这个问题早就解决了,原因是handler在获取数据库连接时居然用了单例模式,因为数据库处理这一块是沿用以前的代码,所以导致数据库连接很快用完,也导致了后面的很多请求无法处理完毕,所以也无法发送Response,也因此导致了内存很快用完。程序从上线到现在从未更新过也未出现过任何故障,也许和我们的交易量小有关系吧。

目前比较有时间,并且Mina很久未更新,所以打算开始Netty的学习。

顶部