首先我怎么确定不是我的业务代码问题:
就是我的业务代码里,没有做任何对这个connection对象的引用。为了确认100%没有做引用,我特意为某个连接做了特殊处理,就是基本上没有业务代码。
什么情况下无法被释放:我做的是HTTP服务,就是在客户端浏览器连接上服务器,但是还没有收到响应,就主动的关闭了连接的情况下。
这时候服务端的这个connection对象,就无法被正常释放回收。
我专门研究了,onClose事件会触发,destroy方法也会被执行,但是destruct方法无法被触发。
我打印了一下堆栈。大概是:
baseRead方法里面有一个代码发现到客户端的连接已经关闭,然后就主动的执行了destroy方法,似乎是试图关闭连接。但是结果是这个连接不能被正常释放。
应该是php还没来得及回收它。执行
gc_collect_cycles();
可以触发回收。后面我看下怎么优化下。但是同时发生的其他连接都被回收了,只有这个情况的连接不被回收。
我个人认为可能是这种情况下,connection的socket对象没有被正常释放,导致连带connection对象无法回收。
我靠,你是对的。确实是php没来得及回收。用gc_collect_cycles()后,就可以了。但是为什么其他类型的连接能回收!?
我个人认为可能是这种情况下,connection的socket对象没有被正常释放,导致连带connection对象无法回收。