2017-07-31 47 views
0

我剛看到一臺機器上發生了MemoryError,我注意到服務器上的可用緩存在這之後急劇增加。有沒有什麼方法可以在拋出錯誤時觸發內存管理任務?或者這可能是由服務器(Linux/CentOs)管理的?MemoryError是否會導致python刷新其緩存?

回答

1

MemoryError沒有的方式,應該導致這種情況發生的話,並沒有其他異常特殊處理,但:

  1. 例外不展開堆棧,和對象沿之間的堆棧只引用異常上升和被抓住通常會被釋放的異常處理完成時(在處理過程中,異常回溯,往往會造成妨礙清理髮生循環引用)從BaseException,不Exception
  2. MemoryError繼承,所以它的少可能會被「通用」0處理塊,意味着更多堆棧層被解開並最終被釋放
  3. CPython循環垃圾回收器determines when to run collections based on the number of allocations and deallocations that have occurred;如果大堆棧展開釋放大量的對象,甚至更多,如果這足以觸發垃圾收集

所有這一切都增加了機率內存將被釋放,但它沒有一個是專門針對MemoryError可能被釋放;如果您點擊Ctrl-C並觸發KeyboardInterrupt,則可能會觀察到相同的行爲。更有可能的是,你看到Python退出,或者Linux正在通過轉儲它的緩存來響應極端的內存請求;在之後MemoryError會來轉儲高速緩存以試圖滿足大內存請求,特別是如果請求是在幾個連續的內存塊請求中進行的,而不是一個巨大的請求。

+0

神奇的解釋,非常感謝! – JacobIRR

相關問題