2012-02-26 64 views

回答

10

下面是從language reference

的對象從未明確銷燬的摘錄;然而,當他們無法到達時,他們可能會被垃圾收集。 允許實現推遲垃圾收集或完全忽略垃圾收集 - 只要沒有收集到仍然可以訪問的對象,實施質量如何實現垃圾收集就成了一個問題。

CPython的實現細節:CPython的目前使用與(可選)延遲環狀連接的垃圾,其中,當他們變得不可達收集大多數物體的檢測的引用計數方案,但不能保證,收集含有循環引用垃圾。有關控制循環垃圾收集的信息,請參閱gc模塊的文檔。其他實現的行爲不同,CPython可能會改變。不要依賴對象在無法訪問時立即敲定(例如:始終關閉文件)。

編輯:關於推遲垃圾回收....的gc模塊可讓您與垃圾回收器交互,如果你想和改變採集頻率等禁用它,但我沒有用它自己。此外,包含__del__方法are not collected的任何對象的循環。

+0

不錯,雖然很香。任何想法如何排放或推遲gc? – 2012-02-26 00:45:40

+0

這是一個不同的問題馬特阿爾科克和答案是可用的。 – erisco 2012-02-26 00:47:21

+0

@MattAlcock:發射或推遲gc? (1)這是一個單獨的問題。和。 (2)你爲什麼想要?如果您不想收集對象垃圾,請將其分配給一個變量。 – 2012-02-26 00:59:08

11

什麼時候在Python中收集對象垃圾?

有在CPython的源代碼中的很多細節:http://svn.python.org/view/python/trunk/Modules/gcmodule.c?revision=81029&view=markup

在任何時間引用計數下降到零,對象被立即刪除。

293/* Python的循環GC不應該看到的傳入引用次數

294 * 0

:如果事情decref'ed爲0,它應該是

295 *當時立即釋放。

當新對象的數量大於現有對象數量的25%時,將觸發完全集合。

87除了各種可配置的閾值,我們只觸發

88充分收集如果比率

89 long_lived_pending/long_lived_total

90高於給定值(硬連線到25%)。

何時釋放內存?

我只能剔除這些信息。

781/*清除所有的自由列表

782 *所有自由列表被最高 代的收集過程中被清除。

783 *在空閒列表中分配的項目可能會保留pymalloc競技場 佔用。

784 *清除空閒列表可能會提前回憶OS。

785 */

據此,Python的可能是保持你的對象空閒列表,即使你把它的引用計數爲零回收。我無法明確地發現什麼時候進行免費調用以將內存回饋給操作系統,但我想象這是在進行收集並且該對象未被保存在空閒列表中時完成的。

集合是否會影響性能?

我聽說過的任何非平凡的垃圾收集器都需要CPU和內存的運行。因此,是的,總是會對性能產生影響。你必須嘗試並瞭解你的垃圾收集器。

需要實時響應的程序我遇到了問題,因爲垃圾收集器不允許我控制它們何時運行或它們的運行時間。一些特殊情況也會導致內存過多使用,例如Python對於保留空閒列表的訣竅。