python2执行程序内存溢出导致被killed的问题因果分析
問題來源:
執(zhí)行一段程序,對(duì)某個(gè)函數(shù)重復(fù)執(zhí)行,當(dāng)執(zhí)行到一半時(shí),就顯示被killed,重復(fù)幾次均如此。為什么會(huì)這樣呢?
第一步、定位被killed的根本原圖;
? ? ? ?使用vi /var/log/messages查看日志。日志顯示,是由于內(nèi)存溢出導(dǎo)致的。
第二步、定位內(nèi)存溢出的原因:
在主要的函數(shù)的前面加入@profile,用于顯示每行代碼的內(nèi)存使用情況。
通過輸出顯示,該函數(shù)的內(nèi)存一直在增長。
第三、第一種假設(shè),會(huì)不會(huì)是某某變量沒有釋放導(dǎo)致內(nèi)存一直在增加。
深入分析發(fā)現(xiàn),并不存在這種情況。因?yàn)闆]有使用到全局變量。
這個(gè)函數(shù)一進(jìn)來,他的內(nèi)存就是上次執(zhí)行的最后使用內(nèi)存。能確定的是字典內(nèi)存肯定沒有釋放。
第四步、加入del與gc.collect命令釋放內(nèi)存
在函數(shù)內(nèi)部加入del與gc.collect命令仍然無法釋放內(nèi)存。其結(jié)果仍然是被killed;
使用profile可以發(fā)現(xiàn)內(nèi)存并沒有得到釋放,至少在運(yùn)行的時(shí)候沒有立馬釋放。
第五步、尋找立馬釋放的方法
網(wǎng)卡搜索此方法有效,如下所示
del lst[:]
del lst
gc.collect
實(shí)驗(yàn)中發(fā)現(xiàn)使用del lst[:]能立馬有效。
最終的結(jié)論就是要?jiǎng)h除真正儲(chǔ)存內(nèi)存的東西,才能真正釋放當(dāng)下釋放內(nèi)存。
?
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的python2执行程序内存溢出导致被killed的问题因果分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AC自动机的使用案例
- 下一篇: dict格式转字符串两种方法的区别