自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

不同編程語(yǔ)言的 GC 機(jī)制對(duì)比

開(kāi)發(fā)
不同編程語(yǔ)言在實(shí)現(xiàn)思路上有相似之處,又各自有不同的側(cè)重點(diǎn),接下來(lái)我們對(duì)比 Python、Java 和 Go 的 GC 機(jī)制來(lái)展開(kāi)聊聊。

大家好,我是小?,一個(gè)漂泊江湖多年的 985 非科班程序員,曾混跡于國(guó)企、互聯(lián)網(wǎng)大廠(chǎng)和創(chuàng)業(yè)公司的后臺(tái)開(kāi)發(fā)攻城獅。

垃圾回收(Garbage collection,簡(jiǎn)稱(chēng) GC)是內(nèi)存管理中一個(gè)非常重要的話(huà)題,不管是何種編程語(yǔ)言,GC 的目標(biāo)都是相同的,即準(zhǔn)確高效地識(shí)別和清理內(nèi)存中的垃圾對(duì)象。

不同編程語(yǔ)言在實(shí)現(xiàn)思路上有相似之處,又各自有不同的側(cè)重點(diǎn),接下來(lái)我們對(duì)比 Python、Java 和 Go 的 GC 機(jī)制來(lái)展開(kāi)聊聊。

Python的垃圾回收特點(diǎn)

1.引用計(jì)數(shù)機(jī)制為主要策略

Python 通過(guò)ob_refcnt字段,追蹤對(duì)象被引用的次數(shù),當(dāng)計(jì)數(shù)減至零時(shí),對(duì)象生命終結(jié),即刻被垃圾回收機(jī)制回收。

這種方式簡(jiǎn)單明了,即時(shí)回收無(wú)用對(duì)象,避免了程序中長(zhǎng)時(shí)間占用無(wú)用內(nèi)存的問(wèn)題,但其自身不能處理循環(huán)引用。

2.標(biāo)記-清除解決循環(huán)引用

Python 輔以標(biāo)記-清除算法,主要處理容器對(duì)象的循環(huán)引用問(wèn)題。Python 中的垃圾回收器會(huì)周期性地執(zhí)行,掃描對(duì)象,標(biāo)記所有從根對(duì)象集合開(kāi)始可訪(fǎng)問(wèn)到的對(duì)象,未被標(biāo)記的對(duì)象即被認(rèn)定為垃圾,進(jìn)行清除。

這種方式確保了即使在復(fù)雜關(guān)聯(lián)關(guān)系中,內(nèi)存也能得到有效管理與釋放。

3.分代回收優(yōu)化性能

為了減少引用計(jì)數(shù)和標(biāo)記-清除乃至內(nèi)存整體的管理開(kāi)銷(xiāo),Python 引入了分代回收機(jī)制,該機(jī)制將對(duì)象分為不同的代(通常是三代),假設(shè)對(duì)象存活時(shí)間越長(zhǎng),越不可能成為垃圾,因此新生代的對(duì)象頻繁檢查回收,老年代對(duì)象檢查回收頻率則低,這樣可以大幅減少垃圾回收帶來(lái)的性能損耗。

Java的垃圾回收特點(diǎn)

1.可達(dá)性分析

Java 垃圾回收器根據(jù)從 GC Root 開(kāi)始的引用鏈,判定對(duì)象是否可達(dá)。

所謂 GC Root,包括類(lèi)靜態(tài)屬性、活動(dòng)線(xiàn)程、JNI 引用等。若對(duì)象在引用鏈上,則視為可達(dá);反之,視為垃圾。這種分析方法摒棄了引用計(jì)數(shù)的局限,有效避免了循環(huán)引用問(wèn)題。

2.分代回收機(jī)制

Java 內(nèi)存空間被劃分為年輕代、老年代和永久代(后改進(jìn)為元空間),這樣的分代機(jī)制讓 Java 的垃圾回收更高效。

年輕代適用更快的垃圾回收算法,因?yàn)槟贻p代對(duì)象生命周期短,死亡速度快。對(duì)于老年代,由于其包含生命周期長(zhǎng)的對(duì)象,因此使用不同的回收策略,減少回收頻率,節(jié)約系統(tǒng)資源。

3.多種垃圾回收器選擇

Java 提供了多種垃圾回收器,比如 Serial、Parallel、CMS、G1 及 ZGC 等,應(yīng)對(duì)不同的使用場(chǎng)景。

比如,Serial 適合客戶(hù)端模式,而 G1 垃圾回收器更適合需要大內(nèi)存、多核服務(wù)器環(huán)境使用,實(shí)現(xiàn)了高并發(fā)和低停頓時(shí)間,它們各取所長(zhǎng),為開(kāi)發(fā)者提供了豐富的內(nèi)存管理選項(xiàng)。

4Go的垃圾回收特點(diǎn)

1.三色標(biāo)記法

Go 語(yǔ)言自 v1.5 以來(lái),采用了三色標(biāo)記法,在程序運(yùn)行期間進(jìn)行垃圾回收,程序執(zhí)行并未完全中斷,這一并發(fā)垃圾回收機(jī)制提高了回收效率。

在操作中,對(duì)象在初始被視為白色(可能是垃圾),然后可達(dá)對(duì)象在遍歷過(guò)程中變?yōu)榛疑ù幚恚┖妥罱K的黑色(存活對(duì)象),未標(biāo)記到的對(duì)象即為垃圾,準(zhǔn)備被回收。

2.三色不變性

在垃圾收集領(lǐng)域,三色不變性是并發(fā)標(biāo)記算法中的一個(gè)重要概念。想要在并發(fā)或者增量的標(biāo)記算法中保證正確性,我們需要達(dá)成以下兩種三色不變性(Tri-color invariant)中的一種:

  • 強(qiáng)三色不變性 — 黑色對(duì)象不會(huì)指向白色對(duì)象,只會(huì)指向灰色對(duì)象或者黑色對(duì)象;
  • 弱三色不變性 — 黑色對(duì)象指向的白色對(duì)象必須包含一條從灰色對(duì)象經(jīng)由多個(gè)白色對(duì)象的可達(dá)路徑;

它確保了在整個(gè)標(biāo)記過(guò)程中,不會(huì)錯(cuò)誤地回收還在使用的對(duì)象。

3.混合寫(xiě)屏障

混合寫(xiě)屏障正是基于三色不變式的一種優(yōu)化實(shí)踐,它在 Go 的垃圾收集器中負(fù)責(zé)在并發(fā)標(biāo)記階段維護(hù)三色不變式的正確性。在 Go v1.8 中引入后,混合寫(xiě)屏障結(jié)合了“插入”和“刪除”屏障的策略,巧妙地減少了因?yàn)槌绦虻倪\(yùn)行而帶來(lái)的標(biāo)記干擾。

插入屏障是指在對(duì)象引用時(shí)進(jìn)行干預(yù),而刪除屏障則是在對(duì)象引用被刪除時(shí)進(jìn)行操作。通過(guò)這一策略,Go 確保了在對(duì)象圖的動(dòng)態(tài)變化下,也不會(huì)因?yàn)檫z漏對(duì)新活對(duì)象的標(biāo)記或錯(cuò)誤地標(biāo)記死對(duì)象而破壞垃圾收集的準(zhǔn)確性,這是并發(fā)收集算法中的一個(gè)巨大突破。

小結(jié)

垃圾回收機(jī)制在內(nèi)存管理中發(fā)揮著核心作用,有效地回收內(nèi)存中的廢棄對(duì)象。

本文比較了 Python、Java 和Go 三種編程語(yǔ)言的垃圾回收策略。

責(zé)任編輯:趙寧寧 來(lái)源: xin猿意碼
相關(guān)推薦

2017-10-20 11:07:45

編程代碼編程模式

2010-03-11 14:13:20

Python編程

2011-08-11 10:12:11

2021-07-20 15:42:05

編程語(yǔ)言PythonJava

2014-05-08 14:13:00

Java面向GC

2023-12-15 14:38:00

GoRust編程語(yǔ)言

2018-10-15 15:42:04

開(kāi)發(fā)工具編程語(yǔ)言源代碼

2009-10-13 09:05:45

反射機(jī)制

2023-04-10 18:34:25

編程語(yǔ)言開(kāi)發(fā)

2020-08-20 20:45:17

KotlinJava優(yōu)勢(shì)

2021-12-02 10:16:10

機(jī)器人編程語(yǔ)言計(jì)算機(jī)語(yǔ)言

2017-10-30 08:53:22

2018-05-10 14:20:02

javaC++語(yǔ)言

2020-10-27 15:01:25

編程語(yǔ)言PythonJava

2023-11-06 07:56:04

2015-07-28 10:43:38

js\height\

2024-07-30 12:24:23

2017-05-02 08:09:26

Python重啟機(jī)制

2021-04-11 09:59:03

編程語(yǔ)言數(shù)據(jù)分析Python

2012-09-28 13:23:43

編程語(yǔ)言語(yǔ)言進(jìn)化程序員
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)