使用Apache Mina时出现outOfMemory错误

发布于 2021-11-24 13:29:11 字数 729 浏览 938 评论 4

问题:我这边是用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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

甜扑 2021-11-29 03:14:46

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

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

疾风者 2021-11-28 22:28:42

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

另外,我使用的是mina 2.0.

明媚如初 2021-11-28 08:34:40

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

 

刘备忘录 2021-11-27 18:06:34

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

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文