2014-01-08 22 views
1

我正在寫一個扭曲的PB應用程序,似乎使用了大量的內存,永遠不會在用戶斷開連接時釋放。Python內存使用不下降

我有一個pb.Root對象,客戶端連接並調用一個返回pb.Referenceable對象的遠程方法,該對象在創建時加速讀取大量信息到內存中(大約2GB的數據)採取行動。此對象以及有關客戶端的其他信息將被插入到列表中。

當客戶端從服務器斷開連接時,我調用一些對該對象的清理操作以刪除對正在存儲的高速緩存對象的引用。該chunkCache是​​我存儲的數據字典。

def disconnected(self): 
    self.connected = False 
    self.chunkCache = None 
    self.cur.close() 

一旦客戶根據上面斷開內存使用率從來沒有下降還在說的2Gb。

我應該擔心這個還是分配的內存會在需要時釋放,或者如果沒有任何想法,我該如何釋放這個內存?它是在創建對象時創建的,並且不會在其他地方傳遞。

在那個對象裏面,我確實有一個deferToThread調用,可以阻止這個項目被釋放嗎?

我在Linux上使用python 2.7。

UPDATE:

林困惑,我剛纔添加的自定義__del__方法,我的對象,並把打印語句在那裏,他們被刪除,所以爲什麼內存使用量也不會下降?

感謝

院長

回答

2

在最新的操作系統,動態內存分配發生在什麼通常被稱爲堆,這基本上只是(不要與同名的數據結構相混淆)一個連續的區域,從某個基地址開始,延伸到基地址加上堆的當前大小。進程開始時只有一小堆(通常只有幾頁),並且通過以系統頁面大小的正整數倍爲單位向上擴展該段,可以根據需要進行增長。在該空間內,分配/釋放會創建更小的內存塊,以滿足程序的需求,以及分配器跟蹤分配哪些內存以及不分配內存所需的任何元數據。隨着時間的推移,這些較小的內存塊可能會被釋放,使得堆段基本上爲空,但除非特別編碼,否則堆段很少會縮小。因此,長期運行的流程似乎會有一個與高峯使用一樣大的堆段。如果需要爲其他進程釋放物理內存,那麼正在使用但不再存在的頁面往往會被交換,但過程映像仍然顯示爲「大」,並且通常不會縮小無需重新啓動。有一些方法可以使用其他內存分配機制(例如,將臨時文件映射到內存空間並在完成時取消映射並將其刪除),但是需要對程序進行專門編碼才能執行此操作。使用C或C++編寫的使用標準庫分配例程(分別爲malloc/freenew/delete)的應用程序(包括Python編譯器/解釋器)將傾向於表現出上述行爲。

+0

這使得很多道理,似乎模仿我的應用程序的行爲。當客戶端重新連接時,內存使用率只會上升到另一個100Mb左右,並在第二個客戶端斷開連接時下降一點。當我做一些診斷來計算所有對象的大小時,它出現在大約400MB,這是一個更合理的點亮。所以你認爲我可以安全地假設我的應用程序沒有問題? – Deano123