日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯網營銷解決方案
創(chuàng)新互聯GO教程:Go語言垃圾回收和SetFinalizer

Go語言自帶垃圾回收機制(GC)。GC 通過獨立的進程執(zhí)行,它會搜索不再使用的變量,并將其釋放。需要注意的是,GC 在運行時會占用機器資源。

GC 是自動進行的,如果要手動進行 GC,可以使用 runtime.GC() 函數,顯式的執(zhí)行 GC。顯式的進行 GC 只在某些特殊的情況下才有用,比如當內存資源不足時調用 runtime.GC() ,這樣會立即釋放一大片內存,但是會造成程序短時間的性能下降。

finalizer(終止器)是與對象關聯的一個函數,通過 runtime.SetFinalizer 來設置,如果某個對象定義了 finalizer,當它被 GC 時候,這個 finalizer 就會被調用,以完成一些特定的任務,例如發(fā)信號或者寫日志等。

在Go語言中 SetFinalizer 函數是這樣定義的:

func SetFinalizer(x, f interface{})

參數說明如下:

  • 參數 x 必須是一個指向通過 new 申請的對象的指針,或者通過對復合字面值取址得到的指針。
  • 參數 f 必須是一個函數,它接受單個可以直接用 x 類型值賦值的參數,也可以有任意個被忽略的返回值。

SetFinalizer 函數可以將 x 的終止器設置為 f,當垃圾收集器發(fā)現 x 不能再直接或間接訪問時,它會清理 x 并調用 f(x)。

另外,x 的終止器會在 x 不能直接或間接訪問后的任意時間被調用執(zhí)行,不保證終止器會在程序退出前執(zhí)行,因此一般終止器只用于在長期運行的程序中釋放關聯到某對象的非內存資源。例如,當一個程序丟棄一個 os.File 對象時沒有調用其 Close 方法,該 os.File 對象可以使用終止器去關閉對應的操作系統(tǒng)文件描述符。

終止器會按依賴順序執(zhí)行:如果 A 指向 B,兩者都有終止器,且 A 和 B 沒有其它關聯,那么只有 A 的終止器執(zhí)行完成,并且 A 被釋放后,B 的終止器才可以執(zhí)行。

如果 *x 的大小為 0 字節(jié),也不保證終止器會執(zhí)行。

此外,我們也可以使用
SetFinalizer(x, nil)來清理綁定到 x 上的終止器。

提示:終止器只有在對象被 GC 時,才會被執(zhí)行。其他情況下,都不會被執(zhí)行,即使程序正常結束或者發(fā)生錯誤。

【示例】在函數 entry() 中定義局部變量并設置 finalizer,當函數 entry() 執(zhí)行完成后,在 main 函數中手動觸發(fā) GC,查看 finalizer 的執(zhí)行情況。

package main

import (
    "log"
    "runtime"
    "time"
)

type Road int

func findRoad(r *Road) {

    log.Println("road:", *r)
}

func entry() {
    var rd Road = Road(999)
    r := &rd

    runtime.SetFinalizer(r, findRoad)
}

func main() {

    entry()

    for i := 0; i < 10; i++ {
        time.Sleep(time.Second)
        runtime.GC()
    }

}

運行結果如下:

2019/11/28 15:32:16 road: 999


網頁名稱:創(chuàng)新互聯GO教程:Go語言垃圾回收和SetFinalizer
URL網址:http://m.5511xx.com/article/dhgsheo.html