精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Go 弱引用和清理機制優化:從 runtime.AddCleanup 到 weak.Pointer

開發 前端
在 Go 語言的發展歷程中,內存管理一直是個重要話題。我們有垃圾回收器幫助自動回收內存,但在某些場景下,比如需要管理系統資源(文件描述符、內存映射等)時,就需要更精細的控制。

今天給大家分享的兩個在垃圾回收(GC)方面挺有意思的新特性:runtime.AddCleanup清理函數和weak.Pointer弱指針。

這兩個功能不僅解決了傳統 finalizer 的痛點,還為內存管理和性能優化提供了全新的解決方案。一起來學習吧!

背景

在 Go 語言的發展歷程中,內存管理一直是個重要話題。我們有垃圾回收器幫助自動回收內存,但在某些場景下,比如需要管理系統資源(文件描述符、內存映射等)時,就需要更精細的控制。

之前主要依賴runtime.SetFinalizer來實現資源清理,但說實話,finalizer 使用起來真的很容易踩坑。

最大的問題就是對象復活(object resurrection):finalizer 會讓原本應該被回收的對象"復活",至少需要兩次 GC 周期才能真正回收內存,還容易造成循環引用問題。

runtime.AddCleanup:更好的資源清理方案

Go 團隊也意識到了這些問題。

隨著 Go 語言的不斷演進,推出了更優雅的解決方案:runtime.AddCleanup和weak.Pointer。

核心改進

runtime.AddCleanup的最大改進在于:清理函數不會接收原始對象作為參數。

這個設計直接解決了 finalizer 的兩大痛點:

  1. 避免對象復活問題。
  2. 支持循環引用的對象清理。

看個實際例子,用內存映射文件來演示:

//go:build unix

package main

import (
    "os"
    "runtime"
    "syscall"
)

type MemoryMappedFile struct {
    data []byte
}

func NewMemoryMappedFile(filename string) (*MemoryMappedFile, error) {
    f, err := os.Open(filename)
    if err != nil {
        returnnil, err
    }
    defer f.Close()

    // 獲取文件信息,主要是文件大小
    fi, err := f.Stat()
    if err != nil {
        returnnil, err
    }

    // 提取文件描述符
    conn, err := f.SyscallConn()
    if err != nil {
        returnnil, err
    }

    var data []byte
    connErr := conn.Control(func(fd uintptr) {
        // 創建內存映射
        data, err = syscall.Mmap(int(fd), 0, int(fi.Size()),
            syscall.PROT_READ, syscall.MAP_SHARED)
    })
    if connErr != nil {
        returnnil, connErr
    }
    if err != nil {
        returnnil, err
    }

    mf := &MemoryMappedFile{data: data}

    // 關鍵來了:設置清理函數
    cleanup := func(data []byte) {
        syscall.Munmap(data) // 忽略錯誤
    }
    runtime.AddCleanup(mf, cleanup, data)

    return mf, nil
}

看到區別了嗎?runtime.AddCleanup接受三個參數:

  1. 要監控的對象:mf。
  2. 清理函數:cleanup。
  3. 清理參數:data。

當mf不再可達時,清理函數會被調用,但接收的參數是data,而不是mf本身。

這樣設計的好處是顯而易見的:

  • mf對象可以立即被回收,不需要等待清理函數執行。
  • 即使mf存在循環引用,也不會阻止清理函數的執行。
  • 內存回收效率大大提高。

weak.Pointer:安全的弱引用

弱指針是另一個很重要的特性。

weak.Pointer允許我們引用一個對象,但不會阻止垃圾回收器回收它。

實際應用場景

繼續用內存映射文件的例子,假設我們的程序經常需要映射相同的文件,為了避免重復的系統調用開銷,我們想要建立一個緩存。

但如果用普通的 map 來緩存,就會面臨一個問題:什么時候刪除緩存 k/v?

弱指針完美解決了這個問題:

package main

import (
    "runtime"
    "sync"
    "weak"
)

var cache sync.Map // map[string]weak.Pointer[MemoryMappedFile]

func NewCachedMemoryMappedFile(filename string) (*MemoryMappedFile, error) {
    var newFile *MemoryMappedFile

    for {
        // 嘗試從緩存加載現有值
        value, ok := cache.Load(filename)
        if !ok {
            // 沒找到緩存,需要時創建新的映射文件
            if newFile == nil {
                var err error
                newFile, err = NewMemoryMappedFile(filename)
                if err != nil {
                    returnnil, err
                }
            }

            // 嘗試安裝新的映射文件
            wp := weak.Make(newFile)
            var loaded bool
            value, loaded = cache.LoadOrStore(filename, wp)
            if !loaded {
                // 成功安裝,設置清理函數來刪除緩存條目
                runtime.AddCleanup(newFile, func(filename string, wp weak.Pointer[MemoryMappedFile]) {
                    // 只有當弱指針相等時才刪除,防止誤刪
                    cache.CompareAndDelete(filename, wp)
                }, filename, wp)
                return newFile, nil
            }
            // 有人搶先安裝了文件,繼續循環檢查
        }

        // 檢查緩存條目是否有效
        if mf := value.(weak.Pointer[MemoryMappedFile]).Value(); mf != nil {
            return mf, nil
        }

        // 發現了等待清理的空條目,主動刪除
        cache.CompareAndDelete(filename, value)
    }
}

這個實現很巧妙:

  1. 弱指針緩存:緩存中存儲的是弱指針,不會阻止對象被回收
  2. 自動清理:當對象不再可達時,清理函數會自動刪除緩存條目
  3. 并發安全:使用sync.Map和CompareAndDelete確保并發安全

弱指針的關鍵特性

通過這個例子,我們可以看到弱指針的幾個重要特性:

  1. 可比較性:弱指針是可比較的,即使指向的對象已經被回收
  2. 穩定身份:每個弱指針都有獨立的身份標識
  3. 安全訪問:通過Value()方法安全訪問,返回 nil 表示對象已被回收

通用緩存實現

基于這些特性,我們甚至可以實現一個通用的弱引用緩存:

type Cache[K comparable, V any] struct {
    create func(K) (*V, error)
    m      sync.Map
}

func NewCache[K comparable, V any](create func(K) (*V, error)) *Cache[K, V] {
    return &Cache[K, V]{create: create}
}

func (c *Cache[K, V]) Get(key K) (*V, error) {
    var newValue *V

    for {
        value, ok := c.m.Load(key)
        if !ok {
            if newValue == nil {
                var err error
                newValue, err = c.create(key)
                if err != nil {
                    returnnil, err
                }
            }

            wp := weak.Make(newValue)
            var loaded bool
            value, loaded = c.m.LoadOrStore(key, wp)
            if !loaded {
                runtime.AddCleanup(newValue, func(key K, wp weak.Pointer[V]) {
                    c.m.CompareAndDelete(key, wp)
                }, key, wp)
                return newValue, nil
            }
        }

        if v := value.(weak.Pointer[V]).Value(); v != nil {
            return v, nil
        }

        c.m.CompareAndDelete(key, value)
    }
}

簡單來說,這就是一個可以自動清理過期條目的緩存,非常適合那些創建成本較高但生命周期不確定的對象。

小心 “坑”

雖然這兩個新特性很強大,但使用時還是要注意以下講到的幾個坑。

1. 避免循環引用

清理函數不能捕獲要監控的對象,否則清理函數永遠不會執行:

// 錯誤示例:清理函數捕獲了mf
runtime.AddCleanup(mf, func() {
    // 這里引用了mf,會導致清理函數永遠不執行
    fmt.Printf("清理 %p\n", mf)
}, nil)

// 正確示例:通過參數傳遞需要的信息
runtime.AddCleanup(mf, func(addr uintptr) {
    fmt.Printf("清理 %p\n", unsafe.Pointer(addr))
}, uintptr(unsafe.Pointer(mf)))

2. 弱指針作為 map 鍵的陷阱

當弱指針作為 map 鍵時,被引用的對象不能從對應的值可達,否則對象永遠不會被回收:

// 有問題的設計
type Node struct {
    name string
}

var registry = make(map[weak.Pointer[Node]]*Node)

// 這樣會導致Node永遠不被回收
func badRegister(n *Node) {
    wp := weak.Make(n)
    registry[wp] = n  // 值直接引用了對象
}

3. 非確定性行為

清理函數和弱指針的行為是非確定性的,依賴于垃圾回收器的運行時機。

測試這類代碼時需要特別小心,可能需要主動觸發 GC:

func TestCleanup(t *testing.T) {
    // 創建對象并設置清理
    var cleaned bool
    obj := &MyObject{}
    runtime.AddCleanup(obj, func() {
        cleaned = true
    })

    // 移除強引用
    obj = nil

    // 強制觸發GC
    runtime.GC()
    runtime.GC()  // 可能需要多次

    if !cleaned {
        t.Error("清理函數未執行")
    }
}

總結

這兩個新特性真的很實用,核心原因在于:

  1. runtime.AddCleanup:比傳統 finalizer 更高效,避免了對象復活問題
  2. weak.Pointer 提供了安全的弱引用機制,非常適合構建緩存和避免內存泄漏
  3. 組合使用:可以構建出強大的內存管理模式,比如自清理緩存

雖然這些是高級特性,使用時需要格外小心,但對于那些對性能有極致要求的場景,它們提供了前所未有的靈活性。

責任編輯:武曉燕 來源: 腦子進煎魚了
相關推薦

2025-02-07 09:18:05

機制Go函數

2016-05-11 10:29:54

Spark Strea數據清理Spark

2025-05-22 09:32:23

2013-09-16 16:48:50

Android優化軟引用

2024-10-09 08:54:31

2025-07-16 09:16:36

2013-08-19 17:14:04

.Net強引用弱引用

2020-02-09 17:23:17

Python數據字典

2024-05-20 08:58:13

Java引用類型垃圾回收器

2025-10-11 08:09:12

2020-12-02 09:01:40

Java基礎

2015-07-08 16:28:23

weak生命周期

2009-06-19 16:19:23

Java對象引用

2016-03-02 09:34:03

runtime消息ios開發

2012-03-20 14:17:33

活動目錄

2018-11-16 16:10:28

JavaOOM編程語言

2025-05-14 03:00:00

Go語言控制

2025-02-12 11:53:18

2025-04-02 07:29:14

2018-10-14 15:52:46

MySQL數據清理數據庫
點贊
收藏

51CTO技術棧公眾號

国产老熟女伦老熟妇露脸| 伊人色综合久久天天五月婷| 毛片基地在线观看| 成人3d动漫在线观看| 欧美日本韩国一区| 日本福利视频在线观看| 日韩电影网址| 蜜桃视频一区二区三区在线观看 | 一本一道波多野毛片中文在线| 精品一区二区久久久| 欧美精品videos另类日本| 亚洲综合自拍网| 99国内精品久久久久| 香蕉久久一区二区不卡无毒影院 | 国产高清自拍99| 一二三区免费视频| 韩国一区二区三区在线观看| 亚洲欧美日韩一区二区在线 | 久久97精品| 欧美日韩精品高清| aa免费在线观看| 日本不卡影院| 国产精品成人免费在线| 精品人伦一区二区三区| 国产绿帽刺激高潮对白| 视频一区中文字幕| 久久乐国产精品| frxxee中国xxx麻豆hd| 中文字幕精品影院| 亚洲黄色有码视频| 黑人巨大猛交丰满少妇| 8av国产精品爽爽ⅴa在线观看| 亚洲国产裸拍裸体视频在线观看乱了| 婷婷五月色综合| 日本成人一区二区三区| 高清视频一区二区| 91久久久久久久久久久久久| av手机天堂网| 夜夜嗨一区二区| 久久99热精品| 国产免费无码一区二区视频| 水蜜桃精品av一区二区| 尤物99国产成人精品视频| 亚洲欧美色图视频| 欧美日韩一区二区三区在线电影 | 日韩高清中文字幕一区| 欧美亚洲国产视频| 日本少妇性生活| 韩国一区二区三区在线观看| 欧美高清激情视频| 免费一级片视频| 国产一区久久| 久久久久久久久久av| 久久久久久久久久一区二区三区 | 国产欧美一区二区三区在线看蜜臀| 国产亚洲情侣一区二区无| 成人精品在线播放| 成人动漫精品一区二区| 国产一区二区自拍| 天堂在线观看av| av亚洲精华国产精华| 九9re精品视频在线观看re6| 日韩专区第一页| 久久亚洲免费视频| 天堂√在线观看一区二区| melody高清在线观看| 国产精品免费视频观看| 亚洲最大免费| 在线中文字幕电影| 亚洲大片免费看| 日本毛片在线免费观看| 午夜精品久久久久久久久久蜜桃| 欧美性色欧美a在线播放| 在线观看日本一区二区| 久久伦理中文字幕| 精品国产成人系列| 麻豆精品免费视频| 色男人天堂综合再现| 大胆人体色综合| 五月天婷婷丁香| 日韩1区2区日韩1区2区| 成人午夜高潮视频| www.久久成人| 91在线观看下载| 亚洲激情电影在线| 欧美黑人xx片| 在线亚洲免费视频| 在线视频日韩欧美| 乱亲女h秽乱长久久久| 国产亚洲欧洲在线| 日本黄色片免费观看| 亚洲国产黄色| 国产欧美一区二区三区久久 | 亚洲欧美另类自拍| 色哟哟一一国产精品| 在线播放不卡| 国产精品专区第二| 人妻夜夜爽天天爽| 国产精品私房写真福利视频| 国产毛片久久久久久国产毛片| 波多野结衣久久精品| 91精品国产综合久久国产大片| 熟妇高潮一区二区| 久久人人88| 97在线看福利| jizz中国少妇| 国产亚洲一本大道中文在线| 欧美精品在欧美一区二区| 偷拍精品精品一区二区三区| 日韩欧美一级精品久久| 亚洲av毛片基地| 亚洲国产国产亚洲一二三| 国产精品免费一区豆花| 懂色av蜜臀av粉嫩av分享吧 | 91精品国产高潮对白| 免费在线观看视频一区| 激情久久av| bt在线麻豆视频| 在线观看国产精品网站| 99久久免费看精品国产一区| 亚洲自拍偷拍网| 国产精品美女av| 蜜桃视频在线免费| 午夜电影久久久| 日本特黄在线观看| 欧美电影一区| 国产精品嫩草影院一区二区| 亚洲av成人精品日韩在线播放| 亚洲自拍另类综合| 色网站在线视频| 97精品一区二区| 国产精品久久久久久av下载红粉| 香蕉视频免费在线看| 亚洲一区二区三区在线| 亚洲av无一区二区三区久久| 国产精品二区不卡| 国产精品爽爽爽| 国产精品天堂| 欧日韩精品视频| 久久丫精品忘忧草西安产品| 久久精品中文| 欧美久久久久久久| 中文字幕这里只有精品| 日韩国产精品视频| 中文字幕激情小说| 91免费在线视频观看| 国产免费黄视频| 日本精品影院| 日本精品免费一区二区三区| 青青青草原在线| 91官网在线免费观看| 亚洲一区视频在线播放| 日韩精品午夜视频| 亚洲巨乳在线观看| 日韩专区视频网站| 不卡中文字幕av| 成人精品在线播放| 精品欧美国产一区二区三区| 女人被狂躁c到高潮| 日韩黄色小视频| 亚洲成人第一| 粉嫩91精品久久久久久久99蜜桃| 中文字幕亚洲综合| 国产农村妇女毛片精品| 一区二区不卡在线视频 午夜欧美不卡在| 男女污污视频网站| 国产精品九九| 欧美一区观看| 欧美综合影院| 欧美成人全部免费| 婷婷久久久久久| 色激情天天射综合网| 影音先锋男人看片资源| 国产一区999| 日日橹狠狠爱欧美超碰| 欧美伦理影院| 亚洲va国产va天堂va久久| 黄色成人在线网| 亚洲美女www午夜| 一卡二卡三卡在线| 亚洲五月六月丁香激情| x88av在线| 国产精品综合久久| 日韩精品―中文字幕| 清纯唯美综合亚洲| 国产精品一国产精品最新章节| 少妇视频在线观看| 日韩在线不卡视频| 色呦呦中文字幕| 欧美午夜精品理论片a级按摩| 久久免费看少妇高潮v片特黄| av在线不卡电影| 亚洲精品综合在线观看| 亚洲精品孕妇| 男女啪啪的视频| 最新国产精品视频| 亚洲影视九九影院在线观看| 松下纱荣子在线观看| 久久精品99国产精品酒店日本| 国产香蕉在线观看| 欧美日韩一级二级三级| 国产无套内射又大又猛又粗又爽| 国产精品天美传媒| 黄色在线观看av| 国产精品一卡二卡| 天天综合网日韩| 亚洲一区二区三区高清不卡| 蜜桃网站在线观看| 日本一区二区在线看| 国内成+人亚洲| 天堂精品久久久久| 国产精品永久免费观看| 日韩伦理精品| 欧美激情亚洲精品| 秋霞午夜在线观看| 亚洲人线精品午夜| 日韩一级片免费看| 日韩精品中文字幕一区二区三区 | 欧美视频免费看| 欧美综合激情网| 大桥未久在线播放| 欧美xxxx18国产| 欧美日韩在线看片| 一区二区三区精品99久久| 青青青草原在线| 日韩av综合网| 手机看片福利在线| 精品国产成人在线影院| 国产高清免费在线观看| 91精品国产综合久久精品麻豆| 午夜一级黄色片| 色一区在线观看| 日本a级c片免费看三区| 欧美视频在线观看免费网址| 日本在线视频中文字幕| 夜夜爽夜夜爽精品视频| 老女人性淫交视频| 一区二区三区色| 日日噜噜夜夜狠狠久久波多野| 中文在线资源观看网站视频免费不卡| 加勒比一区二区| 26uuu色噜噜精品一区二区| 亚洲一区二区三区无码久久| 波多野洁衣一区| a视频免费观看| 91网上在线视频| 超碰97人人干| 久久日韩精品一区二区五区| 成人影视免费观看| 久久精品免视看| 免费在线观看a视频| 中文乱码免费一区二区| 羞羞在线观看视频| 亚洲色图制服丝袜| 久久久无码精品亚洲国产| 亚洲图片欧美色图| 精品成人久久久| 色先锋资源久久综合| 中文字字幕在线中文乱码| 欧美日韩成人一区二区| 99热这里只有精品66| 精品sm在线观看| 日色在线视频| 中文字幕在线亚洲| 污污视频在线看| 97香蕉久久夜色精品国产| 青青热久免费精品视频在线18| 国产日韩欧美在线| 伊色综合久久之综合久久| 久99久视频| 日韩在线看片| 成人免费a级片| 媚黑女一区二区| 午夜免费看毛片| 国产成人在线看| 9.1成人看片| 国产精品国产自产拍高清av王其| 国产乱国产乱老熟300| 黑人狂躁日本妞一区二区三区| 国产精品第六页| 欧美一二区视频| 日本一区高清| 久久精品影视伊人网| 欧美办公室脚交xxxx| 国产精品入口免费视| 9l视频自拍九色9l视频成人| 欧美日韩系列| 欧美精品一级| 妓院一钑片免看黄大片| 国产精品资源网| 少妇人妻好深好紧精品无码| 一区二区三区精品| 久久午夜鲁丝片| 精品噜噜噜噜久久久久久久久试看| 男女视频在线观看免费| 超碰91人人草人人干| 日韩精品久久久久久免费| 欧美午夜影院在线视频| 国产免费久久久| 亚洲美女激情视频| 超碰在线观看免费版| 欧洲亚洲女同hd| 欧美久久亚洲| 亚洲第一在线综合在线| 亚洲毛片一区| 黑人无套内谢中国美女| 中文字幕免费观看一区| 日操夜操天天操| 欧美大片日本大片免费观看| 触手亚洲一区二区三区| 91国内产香蕉| 91精品啪在线观看国产爱臀| 亚洲a∨一区二区三区| 国产精品毛片一区二区三区| 日本一本在线视频| 国产精品乱人伦中文| 一区二区三区在线观看av| 精品成人一区二区三区四区| 久久日韩视频| 国产精品美女在线| 国语产色综合| 亚洲中文字幕无码中文字| 成人午夜在线视频| 黑人巨大精品一区二区在线| 欧美日韩国产电影| 国产高清在线观看| 国产a∨精品一区二区三区不卡| 国产精品色在线网站| 隔壁人妻偷人bd中字| 国产一区二区精品久久| 中文字幕求饶的少妇| 精品视频在线免费观看| 高清av在线| 国产精品久久久久99| 九九久久婷婷| av片中文字幕| 91天堂素人约啪| 黄色一级片免费看| 亚洲精品大尺度| 超级白嫩亚洲国产第一| 国模精品一区二区三区| 99香蕉国产精品偷在线观看 | 99999精品| 日韩码欧中文字| 国产又粗又猛又爽又黄91| 日韩在线欧美在线国产在线| 精品久久毛片| 99精品视频网站| 国产精品一区二区在线播放 | 欧美激情视频在线播放| 国产女人精品视频| 国产精品久久久久一区二区三区厕所| 亚洲久久中文字幕| 1000部国产精品成人观看| 国产丝袜在线视频| 色综合天天综合网国产成人网| 在线日韩成人| av免费播放网址| 久久精品视频网| 亚洲一线在线观看| 欧美成人国产va精品日本一级| 日韩精品一级| 成人免费播放器| 国产亚洲欧美在线| 国产精品欧美激情在线| 色综合男人天堂| 亚洲高清极品| 欧美激情第3页| 亚洲一区视频在线观看视频| 欧美挠脚心网站| 国产欧美精品一区二区三区介绍| 亚洲影视一区| www.自拍偷拍| 在线电影欧美成精品| gogo高清在线播放免费| 日本不卡一二三区| 韩国成人精品a∨在线观看| 国产一级理论片| 国产亚洲欧美一区| 亚洲精品一区国产| 久久精品.com| 亚洲欧美日韩久久精品| 水莓100国产免费av在线播放| 国产精品欧美激情| 狠久久av成人天堂| 91在线无精精品白丝| 欧美大片在线观看一区| 久久天堂av| 国产曰肥老太婆无遮挡| 国产欧美视频在线观看| 亚洲第一大网站| 国产精品jizz在线观看麻豆| 欧美 日韩 国产 一区| 亚洲a v网站| 日韩欧美国产电影| 456成人影院在线观看| 青青草国产免费| 亚洲视频资源在线| 黄色片在线免费观看| 国产精品久久亚洲|