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