首先我怎么確定不是我的業(yè)務(wù)代碼問題:
就是我的業(yè)務(wù)代碼里,沒有做任何對這個(gè)connection對象的引用。為了確認(rèn)100%沒有做引用,我特意為某個(gè)連接做了特殊處理,就是基本上沒有業(yè)務(wù)代碼。
什么情況下無法被釋放:我做的是HTTP服務(wù),就是在客戶端瀏覽器連接上服務(wù)器,但是還沒有收到響應(yīng),就主動的關(guān)閉了連接的情況下。
這時(shí)候服務(wù)端的這個(gè)connection對象,就無法被正常釋放回收。
我專門研究了,onClose事件會觸發(fā),destroy方法也會被執(zhí)行,但是destruct方法無法被觸發(fā)。
我打印了一下堆棧。大概是:
baseRead方法里面有一個(gè)代碼發(fā)現(xiàn)到客戶端的連接已經(jīng)關(guān)閉,然后就主動的執(zhí)行了destroy方法,似乎是試圖關(guān)閉連接。但是結(jié)果是這個(gè)連接不能被正常釋放。
我個(gè)人認(rèn)為可能是這種情況下,connection的socket對象沒有被正常釋放,導(dǎo)致連帶connection對象無法回收。