鍍金池/ 問答/Python  Linux  網(wǎng)絡(luò)安全/ python奇怪的內(nèi)存泄漏問題

python奇怪的內(nèi)存泄漏問題

一般來說函數(shù)里生成的對象在函數(shù)退出后應(yīng)該被回收,可是python貌似并沒有,必須得顯示的調(diào)用gc.collect。這是為什么?以下是測試數(shù)據(jù)

測試環(huán)境: macOS High Sierra 10.13.2

empty_python.py

import time

if __name__ == '__main__':
    time.sleep(1000)

內(nèi)存占用 2.7 MB

leak_python.py

import time
def garbage():
    task = {'action': 'test', 'args': [1,2]}


if __name__ == '__main__':
    for i in range(10000000):
        garbage()
    time.sleep(10000)

剛啟動(dòng)時(shí)內(nèi)存 313.4MB 幾秒鐘后 237.3MB

gc_python.py

import time
def garbage():
    task = {'action': 'test', 'args': [1,2]}


if __name__ == '__main__':
    for i in range(10000000):
        garbage()
    time.sleep(20)
    import gc
    print gc.collect()
    time.sleep(10000)

剛啟動(dòng)時(shí)313.4MB 幾秒后237.3MB collect()輸出后 4.6MB

回答
編輯回答
痞性

你的編譯器的問題?
OS 10.11.6 python2.7 python3.6均正常,內(nèi)存無泄漏,你在終端里運(yùn)行看看,我估計(jì)是你的編譯器的問題

def garbage():
    task1 = {}
    task = {'action': 'test', 'args': task1}
    task1['args'] = task
    
# garbage寫成這樣才會(huì)出現(xiàn)314m內(nèi)存,內(nèi)存泄漏
2017年8月6日 00:21