Tag Archives: NioClientSocketChannelFactory

FreeSWITCH ESL Client内存溢出

Linphone 1.x版本还不支持SUBSCRIBE/NOTIFY,所以也无法知道好友的状态,不得以做了一个代理,客户端每隔一段时间通过代理去freeswitch查询状态,代理用freeswitch ESL Client类连接freeswitch,但是代理运行一段时间之后就会内存溢出,然后崩溃。

2013-04-07 11:16:09,378 WARN [org.apache.mina.filter.logging.LoggingFilter] (LoggingFilter.java:123) – EXCEPTION :
java.lang.OutOfMemoryError: Direct buffer memory
at java.nio.Bits.reserveMemory(Bits.java:633)
at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:95)
at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:288)
at org.jboss.netty.channel.socket.nio.SocketSendBufferPool$Preallocation.<init>(SocketSendBufferPool.java:156)
at org.jboss.netty.channel.socket.nio.SocketSendBufferPool.<init>(SocketSendBufferPool.java:42)
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.<init>(AbstractNioWorker.java:44)
at org.jboss.netty.channel.socket.nio.NioWorker.<init>(NioWorker.java:45)
at org.jboss.netty.channel.socket.nio.NioWorkerPool.createWorker(NioWorkerPool.java:45)
at org.jboss.netty.channel.socket.nio.NioWorkerPool.createWorker(NioWorkerPool.java:28)
at org.jboss.netty.channel.socket.nio.AbstractNioWorkerPool.newWorker(AbstractNioWorkerPool.java:99)
at org.jboss.netty.channel.socket.nio.AbstractNioWorkerPool.init(AbstractNioWorkerPool.java:69)
at org.jboss.netty.channel.socket.nio.NioWorkerPool.<init>(NioWorkerPool.java:39)
at org.jboss.netty.channel.socket.nio.NioWorkerPool.<init>(NioWorkerPool.java:33)
at org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory.<init>(NioClientSocketChannelFactory.java:152)
at org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory.<init>(NioClientSocketChannelFactory.java:117)
at org.freeswitch.esl.client.inbound.Client.connect(Client.java:113)

本来以为是程序里头什么地方资源没释放,后来查了一下,倒还真不是那么回事儿。

具体可以看看:Netty内存泄露XSocket内存泄漏问题深度分析,第一个讲的是现象,第二个更深入一些,说问题在于DirectByteBuffer。

不过第二个实施起来有点难度,而且也不能完全解决问题;而org.freeswitch.esl.client.inbound.Client里头用的NioClientSocketChannelFactory类作为一个工厂类确实没有必要每次都new,做成静态的即可。

于是改代码,然后重新编译。基本就是git和maven,具体可以参考:http://wiki.freeswitch.org/wiki/Java_ESL_Client