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

十載的昆玉網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)整合營(yíng)銷(xiāo)推廣的優(yōu)勢(shì)是能夠根據(jù)用戶(hù)設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整昆玉建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)建站從事“昆玉網(wǎng)站設(shè)計(jì)”,“昆玉網(wǎng)站推廣”以來(lái),每個(gè)客戶(hù)項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
gc 模塊提供下列函數(shù):
gc.enable()
啟用自動(dòng)垃圾回收
gc.disable()
停用自動(dòng)垃圾回收
gc.isenabled()
如果啟用了自動(dòng)回收則返回 True。
gc.collect(generation=2)
若被調(diào)用時(shí)不包含參數(shù),則啟動(dòng)完全的垃圾回收??蛇x的參數(shù) generation 可以是一個(gè)整數(shù),指明需要回收哪一代(從 0 到 2 )的垃圾。當(dāng)參數(shù) generation 無(wú)效時(shí),會(huì)引發(fā) ValueError 異常。返回發(fā)現(xiàn)的不可達(dá)對(duì)象的數(shù)目。
每當(dāng)運(yùn)行完整收集或最高代 (2) 收集時(shí),為多個(gè)內(nèi)置類(lèi)型所維護(hù)的空閑列表會(huì)被清空。 由于特定類(lèi)型特別是 float 的實(shí)現(xiàn),在某些空閑列表中并非所有項(xiàng)都會(huì)被釋放。
gc.set_debug(flags)
設(shè)置垃圾回收器的調(diào)試標(biāo)識(shí)位。調(diào)試信息會(huì)被寫(xiě)入 sys.stderr 。此文檔末尾列出了各個(gè)標(biāo)志位及其含義;可以使用位操作對(duì)多個(gè)標(biāo)志位進(jìn)行設(shè)置以控制調(diào)試器。
gc.get_debug()
返回當(dāng)前調(diào)試標(biāo)識(shí)位。
gc.get_objects(generation=None)
返回一個(gè)收集器所跟蹤的所有對(duì)象的列表,所返回的列表除外。 如果 generation 不為 None,則只返回收集器所跟蹤的屬于該生成的對(duì)象。
在 3.8 版更改: 新的 generation 形參。
引發(fā)一個(gè) 審計(jì)事件 gc.get_objects,附帶參數(shù) generation。
gc.get_stats()
返回一個(gè)包含三個(gè)字典對(duì)象的列表,每個(gè)字典分別包含對(duì)應(yīng)代的從解釋器開(kāi)始運(yùn)行的垃圾回收統(tǒng)計(jì)數(shù)據(jù)。字典的鍵的數(shù)目在將來(lái)可能發(fā)生改變,目前每個(gè)字典包含以下內(nèi)容:
-
collections是該代被回收的次數(shù); -
collected是該代中被回收的對(duì)象總數(shù); -
uncollectable是在這一代中被發(fā)現(xiàn)無(wú)法收集的對(duì)象總數(shù) (因此被移動(dòng)到 garbage 列表中)。
3.4 新版功能.
gc.set_threshold(threshold0[, threshold1[, threshold2]])
設(shè)置垃圾回收閾值(收集頻率)。 將 threshold0 設(shè)為零會(huì)禁用回收。
垃圾回收器把所有對(duì)象分類(lèi)為三代,其依據(jù)是對(duì)象在多少次垃圾回收后幸存。 新建對(duì)象會(huì)被放在最年輕代(第 0 代)。 如果一個(gè)對(duì)象在一次垃圾回收后幸存,它會(huì)被移入下一個(gè)較老代。 由于第 2 代是最老代,這一代的對(duì)象在一次垃圾回收后仍會(huì)保留原樣。 為了確定何時(shí)要運(yùn)行,垃圾回收器會(huì)跟蹤自上一次回收后對(duì)象分配和釋放的數(shù)量。 當(dāng)分配數(shù)量減去釋放數(shù)量的結(jié)果值大于 threshold0 時(shí),垃圾回收就會(huì)開(kāi)始。 初始時(shí)只有第 0 代會(huì)被檢查。 如果自第 1 代被檢查后第 0 代已被檢查超過(guò) threshold1 次,則第 1 也會(huì)被檢查。 對(duì)于第三代來(lái)說(shuō)情況還會(huì)更復(fù)雜,請(qǐng)參閱 Collecting the oldest generation 來(lái)了解詳情。
gc.get_count()
將當(dāng)前回收計(jì)數(shù)以形為 (count0, count1, count2) 的元組返回。
gc.get_threshold()
將當(dāng)前回收閾值以形為 (threshold0, threshold1, threshold2) 的元組返回。
gc.get_referrers(\objs*)
返回直接引用任意一個(gè) objs 的對(duì)象列表。這個(gè)函數(shù)只定位支持垃圾回收的容器;引用了其它對(duì)象但不支持垃圾回收的擴(kuò)展類(lèi)型不會(huì)被找到。
需要注意的是,已經(jīng)解除對(duì) objs 引用的對(duì)象,但仍存在于循環(huán)引用中未被回收時(shí),仍然會(huì)被作為引用者出現(xiàn)在返回的列表當(dāng)中。若要獲取當(dāng)前正在引用 objs 的對(duì)象,需要調(diào)用 collect() 然后再調(diào)用 get_referrers() 。
警告
在使用 get_referrers() 返回的對(duì)象時(shí)必須要小心,因?yàn)槠渲幸恍?duì)象可能仍在構(gòu)造中因此處于暫時(shí)的無(wú)效狀態(tài)。不要把 get_referrers() 用于調(diào)試以外的其它目的。
引發(fā)一個(gè) 審計(jì)事件 gc.get_referrers,附帶參數(shù) objs。
gc.get_referents(\objs*)
返回被任意一個(gè)參數(shù)中的對(duì)象直接引用的對(duì)象的列表。返回的被引用對(duì)象是被參數(shù)中的對(duì)象的C語(yǔ)言級(jí)別方法(若存在) tp_traverse 訪問(wèn)到的對(duì)象,可能不是所有的實(shí)際直接可達(dá)對(duì)象。只有支持垃圾回收的對(duì)象支持 tp_traverse 方法,并且此方法只會(huì)在需要訪問(wèn)涉及循環(huán)引用的對(duì)象時(shí)使用。因此,可以有以下例子:一個(gè)整數(shù)對(duì)其中一個(gè)參數(shù)是直接可達(dá)的,這個(gè)整數(shù)有可能出現(xiàn)或不出現(xiàn)在返回的結(jié)果列表當(dāng)中。
引發(fā)一個(gè) 審計(jì)事件 gc.get_referents,附帶參數(shù) objs。
gc.is_tracked(obj)
當(dāng)對(duì)象正在被垃圾回收器監(jiān)控時(shí)返回 True ,否則返回 False 。一般來(lái)說(shuō),原子類(lèi)的實(shí)例不會(huì)被監(jiān)控,而非原子類(lèi)(如容器、用戶(hù)自定義的對(duì)象)會(huì)被監(jiān)控。然而,會(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)
如果給定對(duì)象已被垃圾回收器終結(jié)則返回 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()
凍結(jié) gc 所跟蹤的所有對(duì)象 —— 將它們移至永久代并忽略所有未來(lái)的集合。 這可以在 POSIX fork() 調(diào)用之前使用以便令對(duì)寫(xiě)入復(fù)制保持友好或加速收集。 并且在 POSIX fork() 調(diào)用之前的收集也可以釋放頁(yè)面以供未來(lái)分配,這也可能導(dǎo)致寫(xiě)入時(shí)復(fù)制,因此建議在主進(jìn)程中禁用 gc 并在 fork 之前凍結(jié),而在子進(jìn)程中啟用 gc。
3.7 新版功能.
gc.unfreeze()
解凍永久代中的對(duì)象,并將它們放回到年老代中。
3.7 新版功能.
gc.get_freeze_count()
返回永久代中的對(duì)象數(shù)量。
3.7 新版功能.
提供以下變量?jī)H供只讀訪問(wèn)(你可以修改但不應(yīng)該重綁定它們):
gc.garbage
一個(gè)回收器發(fā)現(xiàn)不可達(dá)而又無(wú)法被釋放的對(duì)象(不可回收對(duì)象)列表。 從 Python 3.4 開(kāi)始,該列表在大多數(shù)時(shí)候都應(yīng)該是空的,除非使用了含有非 NULL tp_del 空位的 C 擴(kuò)展類(lèi)型的實(shí)例。
如果設(shè)置了 DEBUG_SAVEALL ,則所有不可訪問(wèn)對(duì)象將被添加至該列表而不會(huì)被釋放。
在 3.2 版更改: 當(dāng) interpreter shutdown 即解釋器關(guān)閉時(shí),若此列表非空,會(huì)產(chǎn)生 ResourceWarning ,即資源警告,在默認(rèn)情況下此警告不會(huì)被提醒。如果設(shè)置了 DEBUG_UNCOLLECTABLE ,所有無(wú)法被回收的對(duì)象會(huì)被打印。
在 3.4 版更改: 根據(jù) PEP 442 ,帶有 __del__() 方法的對(duì)象最終不再會(huì)進(jìn)入 gc.garbage 。
gc.callbacks
在垃圾回收器開(kāi)始前和完成后會(huì)被調(diào)用的一系列回調(diào)函數(shù)。這些回調(diào)函數(shù)在被調(diào)用時(shí)使用兩個(gè)參數(shù): phase 和 info 。
phase 可為以下兩值之一:
“start”: 垃圾回收即將開(kāi)始。
“stop”: 垃圾回收已結(jié)束。
info is a dict providing more information for the callback. The following keys are currently defined:
“generation”(代) :正在被回收的最久遠(yuǎn)的一代。
“collected”(已回收的 ): 當(dāng)*phase* 為 “stop” 時(shí),被成功回收的對(duì)象的數(shù)目。
“uncollectable”(不可回收的): 當(dāng) phase 為 “stop” 時(shí),不能被回收并被放入 garbage 的對(duì)象的數(shù)目。
應(yīng)用程序可以把他們自己的回調(diào)函數(shù)加入此列表。主要的使用場(chǎng)景有:
統(tǒng)計(jì)垃圾回收的數(shù)據(jù),如:不同代的回收頻率、回收所花費(fèi)的時(shí)間。
使應(yīng)用程序可以識(shí)別和清理他們自己的在 garbage 中的不可回收類(lèi)型的對(duì)象。
3.3 新版功能.
以下常量被用于 set_debug() :
gc.DEBUG_STATS
在回收完成后打印統(tǒng)計(jì)信息。當(dāng)回收頻率設(shè)置較高時(shí),這些信息會(huì)比較有用。
gc.DEBUG_COLLECTABLE
當(dāng)發(fā)現(xiàn)可回收對(duì)象時(shí)打印信息。
gc.DEBUG_UNCOLLECTABLE
打印找到的不可回收對(duì)象的信息(指不能被回收器回收的不可達(dá)對(duì)象)。這些對(duì)象會(huì)被添加到 garbage 列表中。
在 3.2 版更改: 當(dāng) interpreter shutdown 時(shí),即解釋器關(guān)閉時(shí),若 garbage 列表中存在對(duì)象,這些對(duì)象也會(huì)被打印輸出。
gc.DEBUG_SAVEALL
設(shè)置后,所有回收器找到的不可達(dá)對(duì)象會(huì)被添加進(jìn) garbage 而不是直接被釋放。這在調(diào)試一個(gè)內(nèi)存泄漏的程序時(shí)會(huì)很有用。
gc.DEBUG_LEAK
調(diào)試內(nèi)存泄漏的程序時(shí),使回收器打印信息的調(diào)試標(biāo)識(shí)位。(等價(jià)于 DEBUG_COLLECTABLE | DEBUG_UNCOLLECTABLE | DEBUG_SAVEALL )。
網(wǎng)站欄目:創(chuàng)新互聯(lián)Python教程:gc—-垃圾回收器接口
本文地址:http://www.dlmjj.cn/article/djssede.html


咨詢(xún)
建站咨詢(xún)
