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

MSN可以放弃了

最近MSN超级难登录,经常看见它不停的在哪儿登录,掉线又登录,有时候可能有大半天都登录不上,还时不时的丢消息,忽然想起来似乎哪儿看到新闻说除大陆以外MSN都停止服务了,再想想似乎skype上次自动升级之后界面也有了些变化,于是退出skype一看,果然有了用Microsoft account登录的选项,登录之后再绑定一下skype的帐号就可以了。

skype要用官网的版本,不要用tom版。