zoukankan      html  css  js  c++  java
  • golang垃圾回收和SetFinalizer

    golang自带内存回收机制--GC。GC通过独立的进程执行,它会搜索不再使用的变量,并释放。需要注意的是,进行GC会占用机器资源。

    GC是自动进行的。如果要手动进行GC,可以调用runtime.GC()函数,进行显式GC。

    SetFinalizer

    一个对象object被GC时,如果需要执行一些特殊操作,比如,发信号,或者写日志等,可以通过调用函数
    func SetFinalizer(obj interface{}, finalizer interface{})来实现。

    • 参数obj必须是指针类型。
    • 参数finalizer是一个函数,其参数类型是obj的类型,并且没有返回值。

    SetFinalizer 设置 obj 关联函数为 finalizer 。当调用finalizer函数时,其参数是obj

    当GC发现obj不可达时,会在另一个独立的goroutine中执行 finalizer(obj)。接着,GC会清除obj的关联函数。

    这样,obj再次可达,但是已经关联函数。
    如果接下来SetFinalizer没有被调用, 当下次GC发现obj不可达时,会释放obj

    SetFinalizer只有在对象object被GC时,才会被执行。其他情况下,都不会被执行,即使程序正常结束或者发生错误。

    Demo

    以下代码中,在函数entry()中定义局部变量,并设置finalizer,当函数entry()执行完成后,局部变量已经不再使用,会被GC。

    在main中,手动触发GC,查看finalizer是否被执行。

    code

    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()
            }
    
    }
    

    output

    2019/02/07 17:27:07 road: 999

    参考

    SetFinalizer

    Go入门指南--垃圾回收

  • 相关阅读:
    datatable里的元素
    ajax
    myeclipse编译项目Webcontent下不生成classes文件
    oracle忘记密码
    zuul的多版本配置
    ribbon灰度发布极简方式
    ribbon灰度发布
    使用网关zuul完成灰度发布
    mybatis-generator代码生成器使用(二)
    mybatis-generator代码生成器使用(一)
  • 原文地址:https://www.cnblogs.com/lanyangsh/p/10354994.html
Copyright © 2011-2022 走看看