0 0

朋友们好,Mina开发的服务器端,因LinkedBlockingQueue造成内存泄露5

问题描述:
系统环境:Linux shenzhen1 2.6.38-gentoo-r6 #1 SMP Tue Jul 19 17:24:09 CST 2011 x86_64 Intel(R) Xeon(R) CPU E5606 @ 2.13GHz GenuineIntel GNU/Linux

JDK环境:java version "1.6.0_31"
Java(TM) SE Runtime Environment (build 1.6.0_31-b04)
Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01, mixed mode)

用户量:同时在线用户数量大概是200到700左右;
client全部都是短连接来请求server; 并且通讯协议是http。
server使用了mina的org.apache.mina.filter.codec.demux.MessageDecoderAdapter和DemuxingProtocolCodecFactory来解析client的http协议。

启动程序: java -Xmx1024m -server -jar xxx.jar
运行大概一两周后,就会发生内存泄露,我就使用jmap -dump:format=b,file=heap.bin pid命令导出java内存对象文件,并且使用Memory Analyzer对文件进行分析.

结果:泄露是观察到LinkedBlockingQueue$Node有94000个(每一个对象引用了一个NioSocketSession),造成1G内java存会OutOfMemory。

其中:SocketSessionConfig选项的设置如下:
<bean id="ioAcceptor" class="org.apache.mina.transport.socket.nio.NioSocketAcceptor" destroy-method="unbind">
</bean>
<bean id="SocketSessionConfig" ....>
<property name="tcpNoDelay" value="false"></property><!-- default:false_not-now-send-->
<property name="readBufferSize" value="2048"></property><!-- default:2048B -->
<property name="idleTime" value="40"></property>
<property name="backlog" value="150" /><!-- default:50 -->
<property name="receiveBufferSize" value="1024"></property>
<property name="sendBufferSize"  value="1024"></property>
<property name="keepAlive"  value="false"></property>
<property name="writeTimeout" value="20" /><!-- 发送超时的控制,default:60 -->
</bean>


其中: mina的过滤器链配置如下:
       <!-- 构造多线程过滤器 -->
<bean id="executorFilter" class="org.apache.mina.filter.executor.ExecutorFilter" />
<!-- 构造协议过滤器 -->
<bean id="codecFilter" class="org.apache.mina.filter.codec.ProtocolCodecFilter">
<constructor-arg>
<bean class="com.tianyilink.zxj.minaserver.filter.myhttp.HttpServerProtocolCodecFactory">
<constructor-arg type="java.lang.String" value="UTF-8"></constructor-arg>
</bean>
</constructor-arg>
</bean>
<!-- 构造日志过滤器 -->
<bean id="loggingFilter" class="org.apache.mina.filter.logging.LoggingFilter" />


<!-- 构造过滤器链 -->
<bean id="filterChainBuilder"
class="org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder">
<property name="filters">
<map>
<entry key="codecFilter" value-ref="codecFilter" />
<!-- <entry key="loggingFilter" value-ref="loggingFilter" />  -->
<entry key="executor" value-ref="executorFilter" />
</map>
</property>
</bean>


请问以上内存泄露,怎么解决?谢谢

问题补充:
greenmartian 写道
不太了解那个LinkedBlockingQueue,猜测一下
LinkedBlockingQueue如果是mina自己使用,可能是因为你没有正确关闭连接,导致存储的连接越来越多。
如果你建的LinkedBlockingQueue,可能是没有及时清除存储的内容。



谢谢。
LinkedBlockingQueue是mina里面的。
我关闭连接是使用:
(1)异常错误时,调用iosession.close(true);
(2)正确响应后调用iosession.close(false);
(3)mina的版本是2.0.4

并且我时常使用jmap和jstat来跟踪内存对象,和gc的回收情况,并未发现内存泄露的情况。而后过几天的某一时刻,突然内存爆增,造成内存超过1G。

问题补充:
11lingxian 写道
我想知道当Out Of Memory时,连接的IP地址都是哪些,如果大部分是一样的,就考虑一下网络攻击的问题了


IP都不一样,而且都是手机网络,移动网关的IP

问题补充:
greenmartian 写道
程序内是否有日志记录当时连接数?看看内存暴增时刻连接数是否与LinkedBlockingQueue$Node数量一致


确实不一致,我是使用netstat来判断的连接数量的。
我不知是否是因为jvm在gc时有问题。
(1)netstat的全部连接数1000到2000个。
(2)LinkedBlockingQueue$Node有94000个。

4个答案 按时间排序 按投票排序

0 0

手机网络,移动网关,与服务器连接的实际上是网关,如果客户端下线,网关没有检测到,网关与你服务器的连接是不会断的。服务器需要定时向session发送消息,如果没有应答,就需要关闭session。

2012年10月28日 14:20
0 0

程序内是否有日志记录当时连接数?看看内存暴增时刻连接数是否与LinkedBlockingQueue$Node数量一致

2012年4月12日 02:25
0 0

我想知道当Out Of Memory时,连接的IP地址都是哪些,如果大部分是一样的,就考虑一下网络攻击的问题了

2012年4月10日 13:32
0 0

不太了解那个LinkedBlockingQueue,猜测一下
LinkedBlockingQueue如果是mina自己使用,可能是因为你没有正确关闭连接,导致存储的连接越来越多。
如果你建的LinkedBlockingQueue,可能是没有及时清除存储的内容。

2012年4月09日 17:44

相关推荐

    MINA 服务器端实现 可运行

    MINA(Multipurpose Infrastructure for Network Applications)是一个高性能、异步事件驱动的网络应用程序框架,用于构建高并发、低...通过学习和实践"MINA_Server_Test",你可以进一步提升在服务器端开发方面的技能。

    Mina开发之服务器

    Mina开发之服务器的代码,详情请查看:http://www.cnblogs.com/getherBlog/p/3937196.html Mina开发之客户端的代码,详情请查看:http://www.cnblogs.com/getherBlog/p/3937196.html

    mina通信服务器端客户端源码.rar

    代码利用mina框架实现了服务器端和客户端,客户端的登录请求、客户端向服务器端请求图片文件的功能。代码分为服务端和客户端,开发环境eclipse。服务器代码可在web项目中使用,客户端代码可以在Android开发时使用,...

    Mina开发之客户端

    Apache Mina(Minimum Asynchronous Network)是一个高度可扩展的、高性能的网络应用框架,主要用于构建服务器端的网络应用程序。它简化了网络编程的复杂性,提供了基于事件驱动和异步I/O模型的API。在本文中,我们...

    mina服务器和客服端实现

    《mina服务器和客户端实现详解》 Apache Mina(Minimum Asynchronous Network)是一个高度可扩展的...无论是在服务器端还是客户端,Mina都展示了其强大的灵活性和可扩展性,是构建分布式系统和网络服务的理想选择。

    mina2.0.7实例(服务器端与客户端)

    服务器端模拟SFS2X的一些实用功能对mina框架作了一定的封装,使用起来己经和SFS2X没有 太多的区别,但客户端只能使用mina组件(也就是说只能是JAVA客户端,这个实在有点麻烦,一直 想应用在unity3d中,没有实现,不懂...

    Mina客户端服务器Demo

    - **服务器端**:首先,服务器会创建一个Acceptor,监听指定端口的连接请求。每当有新的连接到达,服务器就会创建一个新的Session,并关联一个IoHandler实例,用于处理来自客户端的数据。 - **客户端**:客户端通过...

    Java视频教程 Java游戏服务器端开发 Netty NIO AIO Mina视频教程

    jaca视频教程 jaca游戏服务器端开发 Netty NIO AIO Mina视频教程 课程目录: 一、Netty快速入门教程 01、第一课NIO 02、第二课netty服务端 03、第三课netty客户端 04、第四课netty线程模型源码分析(一) 05、...

    MINA开发手册和JAR包

    5. **丰富的API**:MINA提供了全面的API,包括用于创建服务器、处理连接、读写数据等,让开发者可以专注于业务逻辑,而不是底层网络细节。 **MINA开发手册**: 提供的`mina中文开发手册.pdf`和`MINA开发文档.doc`是...

    mina的Android端全套jar

    在Android开发中,mina库可以用于实现高效的服务器与客户端之间的数据传输,尤其适用于需要进行大量网络交互的应用,如在线游戏、实时通信应用等。下面我们将深入探讨mina在Android端的应用及其核心概念。 1. **...

    mina客户端服务器简易Demo

    Mina服务器端主要负责监听网络连接、接收客户端请求并发送响应。在这个Demo中,服务器端通常会包含以下组件: 1. **ServerBootstrap**: 这是服务器启动的核心类,用于配置服务器的参数,如绑定端口、选择NIO或BIO...

    mina 服务器开发例子

    然后,我们需要创建一个Acceptor,它是服务器端的入口,负责监听指定的端口并接受客户端的连接。以下是一个简单的Acceptor示例: ```java public class MyServer { public static void main(String[] args) throws...

    mina 服务器socket客服端发消息

    在Java开发中,Mina(Java Minimal Asynchronous Network Engine)是一个高性能、易用的网络通信框架,常用于构建网络服务,如TCP/IP和UDP服务。本文将深入探讨如何使用Mina来实现一个服务器以及对应的Socket客户端...

    mina作为服务器的用法

    Mina支持多种协议,如TCP/IP、UDP、SSL/TLS等,因此常用于构建服务器端应用,如HTTP服务器、FTP服务器、聊天服务器等。 标题“mina作为服务器的用法”表明我们将探讨如何使用Mina框架来搭建和操作服务器。这个主题...

    mina开发示例

    最近使用Mina开发一个Java的NIO服务端程序,因此也特意学习了Apache的这个Mina框架。 首先,Mina是个什么东西?看下官方网站(http://mina.apache.org/)对它的解释: Apache的Mina(Multipurpose Infrastructure ...

    mina开发手册与mina完全自学手册.rar

    这份文档可能会详细介绍如何使用Mina构建网络服务,包括服务器端和客户端的设置,事件处理机制,以及如何处理各种网络通信协议。它可能还包含了Mina的配置选项、性能优化技巧以及异常处理策略。 而《mina中文开发...

    Mina长连接框架实现Android客户端与服务器端通信

    在Android客户端与服务器端通信中,Mina框架因其高效的异步I/O处理能力,常被用来构建长连接,实现稳定且低延迟的数据传输。 长连接是指在通信过程中,一旦建立起连接,就保持该连接不关闭,直到通信结束或出现异常...

    mina开发实例

    这些例子可能涵盖了如何创建服务器端、客户端,以及如何处理各种网络事件,如数据接收、发送、连接管理和断开等。 在实际的Mina开发中,通常会遇到以下知识点: 1. **服务端配置**:创建一个Mina服务端,需要定义...

    mina 服务器简介,个人感觉不错

    Apache Mina是一个高性能的网络应用框架,主要用于简化开发网络服务应用程序。Mina提供了一种抽象层,使得开发者能够专注于业务逻辑,而不是底层的网络通信细节。以下是对Mina服务器核心概念的详细解释: 1. **...

Global site tag (gtag.js) - Google Analytics