作者sean72 (.)
看板Python
標題Re: [問題] constructor
時間Tue Dec 16 18:24:15 2014
※ 引述《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