看板 Python 關於我們 聯絡資訊
※ 引述《sean72 (.)》之銘言: : 標題: [問題] constructor : 時間: Tue Dec 16 15:49:41 2014 : : import socket : : class TCP: : def __init__(self, ip, port): : self.abc = 'hello' : : s = socket.socket(xxxxxxxx) : s.connect(ip, port) # use python lib to create tcp connection : : : conn = TCP(192.168.1.1, 1234) : : : 上面是一段pseudo code : 請問如果s.connect()沒有成功 : python raise err : __init__()沒有完成 : 變數conn也不會成功的allocate memory : 但是self.abc這個變數呢? 會默默地吃掉一些記憶體嗎? : 應該不會才對吧? 因為self, 也就是conn沒有成功的init : : : : : -- : ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 76.169.54.91 : ※ 文章網址: http://www.ptt.cc/bbs/Python/M.1418716183.A.466.html : → uranusjr: 其實事情比你想的要複雜很多, 但要解釋清楚很麻煩 12/16 16:32 : → uranusjr: 在這個例子裡 Python 會幫你把它搞定, 不用想太多 12/16 16:32 我手邊有一個案子 python system是一個在Linux上面執行的app python 跑了一周左右會莫名的掛掉 Linux活著 因此推測是python 吃了太多系統資源而被OS關掉 其中一個徵兆是free memory不斷的減少 因此推測python app有memory leak 從app內部err log可知 python app在閒置狀態什麼事情都沒有做 唯一執行的是: 嘗試重新tcp連線 但是因為並沒有接上一個實體的ethernet device 所以連線一定 time out 所以python app一直re-connect -> socket close -> re-connect -> socket close memory leak我能想到的原因有 1. 一個無限制增加的 global list / dict 2. cyclic referencing 3. recursive無窮迴圈 但是程式裡面都沒有上面三個寫法 因此懷疑 if there was any memory not free-ed by pyhton when __init__ failed 謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 76.169.54.91 ※ 文章網址: http://www.ptt.cc/bbs/Python/M.1418725458.A.C5F.html ※ 編輯: sean72 (76.169.54.91), 12/16/2014 18:25:39
alibuda174: 從你的程式看不出來有memory leak 12/16 19:32
LiloHuang: 直接用 Valgrind 來看看是不是有 leak 最快 12/16 20:07
LiloHuang: 如果有再進一步來抓看看是否有哪個 PyObject 沒被放掉 12/16 20:09
ccwang002: 可以用 Guppy 的 heapy 看 heap 上 PyObject 的變化 12/17 00:14
uranusjr: 你推論跳太快了, 至少先 ps 一下證明是 Python 在吃啊 12/17 11:02