full gc 次數 32 GC 是怎樣工作的?

2021-10-11 08:42:17 字數 1305 閱讀 8492

雖然已經再三提到這一點,但是還是需要注意,gc 只管理那些容器物件,比如 list、dict、set 之類,這些物件的建立都是通過 _pyobject_gc_alloc 實現,gc 則在每次通過這個函式建立之時,試圖進行記憶體**。當然並不是每次都會觸發,記憶體**需要滿足一定的條件,其中最主要的一條是:

// modules/gcmodule.c:1971
0 代物件總數需要超過閾值: 700,所以記憶體**的首要條件是 0 代記憶體的情況。

在繼續深入之前,我們先大致對分代**有乙個大致了解。分代思想是基於這樣乙個假設:

大多數物件都是短暫出現,很快被釋放;生存了一段時間的物件,似乎有可能生存更久。
分代思想的目的是將探測的注意力集中在 「臨時」 物件上,對於那些記憶體中 「似乎」 更有可能萬年長青的 「長者」 網開一面,容後處理。python 採用了 3 代模式:

每經過一次**,年輕代中逃過 gc 生存下來物件,會被提公升到更老的代,享受一些優待,減少對它們的掃瞄。

現在我們繼續,當 0 代物件數量超過閾值 700 後,就會進入 collect_generations 函式:

// modules/gcmodule.c:1246
這些**說明,開始記憶體**的條件是由 0 代決定,而具體**哪幾代物件則以最老的代為準。注意這裡檢測到符合條件的最老一代就立刻 break 了,不要輕易認為只處理這一代,稍後會看到為什麼不能這麼武斷。

從 collect_with_callback 函式開始,短暫的經過 collect_with_callback 函式,很快就進入了最核心的 collect 函式,這裡先大致梳理 collect 函式的梗概:

static
這樣就比較清晰了,檢測到某一代記憶體符合**條件,所有比其更年輕的物件都會被納入**範圍。既然每次都是從最古老的物件開始檢查,為什麼最開始又偏偏以 0 代為開始 gc 的條件呢? 其實很容易理解,除了 0 代,其他代物件都是從 0 代公升格的,如果 0 代物件數量沒有發生變化,1、2 代的物件數量自然也不會有什麼太大變動了。

關注我,了解程式設計師的燒腦日常,還有開源 python 教程。

Oracle單個資料檔案超過32G後需要擴容

表空間資料檔案容量與db block size的設定有關,而這個引數在建立資料庫例項的時候就已經指定。db block size引數可以設定為4k 8k 16k 32k 64k等幾種,oracle的物理檔案最大只允許4194304個資料塊 這個引數具體由作業系統決定,一般應該是此數字 表空間資料檔案...

海盜船推出首款32G單條記憶體 約人民幣1000元

techweb 據外媒報道,海盜船已經推出第一款32gb單條記憶體,售價149美元起,約合人民幣1000元。海盜船是全球最大的記憶體 商之一,旗下的儲存 電源和外設產品在業界聞名。為了製造一根32gb的記憶體條,廠商需要單顆容量為16gb的記憶體顆粒,而這需要使用最先進的dram生產科技 第二或第三...

32位與4G記憶體限制

32位有4g記憶體限制,好像人所共知。但這個32位是指32位的cpu還是32位的作業系統?答案是,都是。記憶體限制,是作業系統和硬體 cpu,也許還有記憶體控制器 共同制約的。cpu對應的是定址實體地址,而作業系統對應的是定址邏輯位址。實際上使用者在使用計算機時,程序所訪問到的位址是邏輯位址,並不是...