gc --- 垃圾回收器接口?


此模塊提供可選的垃圾回收器的接口,提供的功能包括:關(guān)閉收集器、調整收集頻率、設置調試選項。它同時(shí)提供對回收器找到但是無(wú)法釋放的不可達對象的訪(fǎng)問(wèn)。由于 Python 使用了帶有引用計數的回收器,如果你確定你的程序不會(huì )產(chǎn)生循環(huán)引用,你可以關(guān)閉回收器??梢酝ㄟ^(guò)調用 gc.disable() 關(guān)閉自動(dòng)垃圾回收。若要調試一個(gè)存在內存泄漏的程序,調用 gc.set_debug(gc.DEBUG_LEAK) ;需要注意的是,它包含 gc.DEBUG_SAVEALL ,使得被垃圾回收的對象會(huì )被存放在 gc.garbage 中以待檢查。

gc 模塊提供下列函數:

gc.enable()?

啟用自動(dòng)垃圾回收

gc.disable()?

停用自動(dòng)垃圾回收

gc.isenabled()?

如果啟用了自動(dòng)回收則返回 True。

gc.collect(generation=2)?

若被調用時(shí)不包含參數,則啟動(dòng)完全的垃圾回收??蛇x的參數 generation 可以是一個(gè)整數,指明需要回收哪一代(從 0 到 2 )的垃圾。當參數 generation 無(wú)效時(shí),會(huì )引發(fā) ValueError 異常。返回發(fā)現的不可達對象的數目。

每當運行完整收集或最高代 (2) 收集時(shí),為多個(gè)內置類(lèi)型所維護的空閑列表會(huì )被清空。 由于特定類(lèi)型特別是 float 的實(shí)現,在某些空閑列表中并非所有項都會(huì )被釋放。

gc.set_debug(flags)?

設置垃圾回收器的調試標識位。調試信息會(huì )被寫(xiě)入 sys.stderr 。此文檔末尾列出了各個(gè)標志位及其含義;可以使用位操作對多個(gè)標志位進(jìn)行設置以控制調試器。

gc.get_debug()?

返回當前調試標識位。

gc.get_objects(generation=None)?

返回一個(gè)收集器所跟蹤的所有對象的列表,所返回的列表除外。 如果 generation 不為 None,則只返回收集器所跟蹤的屬于該生成的對象。

在 3.8 版更改: 新的 generation 形參。

引發(fā)一個(gè) 審計事件 gc.get_objects,附帶參數 generation。

gc.get_stats()?

返回一個(gè)包含三個(gè)字典對象的列表,每個(gè)字典分別包含對應代的從解釋器開(kāi)始運行的垃圾回收統計數據。字典的鍵的數目在將來(lái)可能發(fā)生改變,目前每個(gè)字典包含以下內容:

  • collections 是該代被回收的次數;

  • collected 是該代中被回收的對象總數;

  • uncollectable 是在這一代中被發(fā)現無(wú)法收集的對象總數 (因此被移動(dòng)到 garbage 列表中)。

3.4 新版功能.

gc.set_threshold(threshold0[, threshold1[, threshold2]])?

設置垃圾回收閾值(收集頻率)。 將 threshold0 設為零會(huì )禁用回收。

垃圾回收器把所有對象分類(lèi)為三代,其依據是對象在多少次垃圾回收后幸存。 新建對象會(huì )被放在最年輕代(第 0 代)。 如果一個(gè)對象在一次垃圾回收后幸存,它會(huì )被移入下一個(gè)較老代。 由于第 2 代是最老代,這一代的對象在一次垃圾回收后仍會(huì )保留原樣。 為了確定何時(shí)要運行,垃圾回收器會(huì )跟蹤自上一次回收后對象分配和釋放的數量。 當分配數量減去釋放數量的結果值大于 threshold0 時(shí),垃圾回收就會(huì )開(kāi)始。 初始時(shí)只有第 0 代會(huì )被檢查。 如果自第 1 代被檢查后第 0 代已被檢查超過(guò) threshold1 次,則第 1 也會(huì )被檢查。 對于第三代來(lái)說(shuō)情況還會(huì )更復雜,請參閱 Collecting the oldest generation 來(lái)了解詳情。

gc.get_count()?

將當前回收計數以形為 (count0, count1, count2) 的元組返回。

gc.get_threshold()?

將當前回收閾值以形為 (threshold0, threshold1, threshold2) 的元組返回。

gc.get_referrers(*objs)?

返回直接引用任意一個(gè) ojbs 的對象列表。這個(gè)函數只定位支持垃圾回收的容器;引用了其它對象但不支持垃圾回收的擴展類(lèi)型不會(huì )被找到。

需要注意的是,已經(jīng)解除對 objs 引用的對象,但仍存在于循環(huán)引用中未被回收時(shí),仍然會(huì )被作為引用者出現在返回的列表當中。若要獲取當前正在引用 objs 的對象,需要調用 collect() 然后再調用 get_referrers() 。

警告

在使用 get_referrers() 返回的對象時(shí)必須要小心,因為其中一些對象可能仍在構造中因此處于暫時(shí)的無(wú)效狀態(tài)。不要把 get_referrers() 用于調試以外的其它目的。

引發(fā)一個(gè) 審計事件 gc.get_referrers,附帶參數 objs。

gc.get_referents(*objs)?

返回被任意一個(gè)參數中的對象直接引用的對象的列表。返回的被引用對象是被參數中的對象的C語(yǔ)言級別方法(若存在) tp_traverse 訪(fǎng)問(wèn)到的對象,可能不是所有的實(shí)際直接可達對象。只有支持垃圾回收的對象支持 tp_traverse  方法,并且此方法只會(huì )在需要訪(fǎng)問(wèn)涉及循環(huán)引用的對象時(shí)使用。因此,可以有以下例子:一個(gè)整數對其中一個(gè)參數是直接可達的,這個(gè)整數有可能出現或不出現在返回的結果列表當中。

引發(fā)一個(gè) 審計事件 gc.get_referents,附帶參數 objs。

gc.is_tracked(obj)?

當對象正在被垃圾回收器監控時(shí)返回 True ,否則返回 False 。一般來(lái)說(shuō),原子類(lèi)的實(shí)例不會(huì )被監控,而非原子類(lèi)(如容器、用戶(hù)自定義的對象)會(huì )被監控。然而,會(huì )有一些特定類(lèi)型的優(yōu)化以便減少垃圾回收器在簡(jiǎn)單實(shí)例(如只含有原子性的鍵和值的字典)上的消耗。

>>>
>>> gc.is_tracked(0)
False
>>> gc.is_tracked("a")
False
>>> gc.is_tracked([])
True
>>> gc.is_tracked({})
False
>>> gc.is_tracked({"a": 1})
False
>>> gc.is_tracked({"a": []})
True

3.1 新版功能.

gc.is_finalized(obj)?

如果給定對象已被垃圾回收器終結則返回 True,否則返回 False。

>>>
>>> x = None
>>> class Lazarus:
...     def __del__(self):
...         global x
...         x = self
...
>>> lazarus = Lazarus()
>>> gc.is_finalized(lazarus)
False
>>> del lazarus
>>> gc.is_finalized(x)
True

3.9 新版功能.

gc.freeze()?

凍結 gc 所跟蹤的所有對象 —— 將它們移至永久代并忽略所有未來(lái)的集合。 這可以在 POSIX fork() 調用之前使用以便令對寫(xiě)入復制保持友好或加速收集。 并且在 POSIX fork() 調用之前的收集也可以釋放頁(yè)面以供未來(lái)分配,這也可能導致寫(xiě)入時(shí)復制,因此建議在主進(jìn)程中禁用 gc 并在 fork 之前凍結,而在子進(jìn)程中啟用 gc。

3.7 新版功能.

gc.unfreeze()?

解凍永久代中的對象,并將它們放回到年老代中。

3.7 新版功能.

gc.get_freeze_count()?

返回永久代中的對象數量。

3.7 新版功能.

提供以下變量?jì)H供只讀訪(fǎng)問(wèn)(你可以修改但不應該重綁定它們):

gc.garbage?

一個(gè)回收器發(fā)現不可達而又無(wú)法被釋放的對象(不可回收對象)列表。 從 Python 3.4 開(kāi)始,該列表在大多數時(shí)候都應該是空的,除非使用了含有非 NULL tp_del 空位的 C 擴展類(lèi)型的實(shí)例。

如果設置了 DEBUG_SAVEALL ,則所有不可訪(fǎng)問(wèn)對象將被添加至該列表而不會(huì )被釋放。

在 3.2 版更改: interpreter shutdown 即解釋器關(guān)閉時(shí),若此列表非空,會(huì )產(chǎn)生 ResourceWarning ,即資源警告,在默認情況下此警告不會(huì )被提醒。如果設置了 DEBUG_UNCOLLECTABLE ,所有無(wú)法被回收的對象會(huì )被打印。

在 3.4 版更改: 根據 PEP 442 ,帶有 __del__() 方法的對象最終不再會(huì )進(jìn)入 gc.garbage 。

gc.callbacks?

在垃圾回收器開(kāi)始前和完成后會(huì )被調用的一系列回調函數。這些回調函數在被調用時(shí)使用兩個(gè)參數: phaseinfo 。

phase 可為以下兩值之一:

"start": 垃圾回收即將開(kāi)始。

"stop": 垃圾回收已結束。

info is a dict providing more information for the callback. The following keys are currently defined:

"generation"(代) :正在被回收的最久遠的一代。

"collected"(已回收的 ): 當*phase* 為 "stop" 時(shí),被成功回收的對象的數目。

"uncollectable"(不可回收的): 當 phase 為 "stop" 時(shí),不能被回收并被放入 garbage 的對象的數目。

應用程序可以把他們自己的回調函數加入此列表。主要的使用場(chǎng)景有:

統計垃圾回收的數據,如:不同代的回收頻率、回收所花費的時(shí)間。

使應用程序可以識別和清理他們自己的在 garbage 中的不可回收類(lèi)型的對象。

3.3 新版功能.

以下常量被用于 set_debug()

gc.DEBUG_STATS?

在回收完成后打印統計信息。當回收頻率設置較高時(shí),這些信息會(huì )比較有用。

gc.DEBUG_COLLECTABLE?

當發(fā)現可回收對象時(shí)打印信息。

gc.DEBUG_UNCOLLECTABLE?

打印找到的不可回收對象的信息(指不能被回收器回收的不可達對象)。這些對象會(huì )被添加到 garbage 列表中。

在 3.2 版更改: interpreter shutdown 時(shí),即解釋器關(guān)閉時(shí),若 garbage 列表中存在對象,這些對象也會(huì )被打印輸出。

gc.DEBUG_SAVEALL?

設置后,所有回收器找到的不可達對象會(huì )被添加進(jìn) garbage 而不是直接被釋放。這在調試一個(gè)內存泄漏的程序時(shí)會(huì )很有用。

gc.DEBUG_LEAK?

調試內存泄漏的程序時(shí),使回收器打印信息的調試標識位。(等價(jià)于 DEBUG_COLLECTABLE | DEBUG_UNCOLLECTABLE | DEBUG_SAVEALL )。