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入门指南--垃圾回收

原文地址:https://www.cnblogs.com/lanyangsh/p/10354994.html

时间: 2024-11-03 15:01:46

golang垃圾回收和SetFinalizer的相关文章

golang 垃圾回收 gc

http://ruizeng.net/golang-gc-internals/ 摘要 在实际使用go语言的过程中,碰到了一些看似奇怪的内存占用现象,于是决定对go语言的垃圾回收模型进行一些研究.本文对研究的结果进行一下总结. 什么是垃圾回收? 曾几何时,内存管理是程序员开发应用的一大难题.传统的系统级编程语言(主要指C/C++)中,程序员必须对内存小心的进行管理操作,控制内存的申请及释放.稍有不慎,就可能产生内存泄露问题,这种问题不易发现并且难以定位,一直成为困扰开发者的噩梦.如何解决这个头疼的

Golang——垃圾回收GC

Go 垃圾回收原理 Golang源码探索(三) GC的实现原理 引用计数:对每个对象维护一个引用计数,当引用该对象的对象被销毁时,引用计数减1,当引用计数器为0是回收该对象. 优点:对象可以很快的被回收,不会出现内存耗尽或达到某个阀值时才回收. 缺点:不能很好的处理循环引用,而且实时维护引用计数,有也一定的代价. 代表语言:Python.PHP.Swift 标记-清除:从根变量开始遍历所有引用的对象,引用的对象标记为"被引用",没有被标记的进行回收. 优点:解决了引用计数的缺点. 缺点

(转)golang 垃圾回收机制

作者:zzZ 原文地址 原文使用 署名 - 非商业性使用 - 相同方式共享 4.0 国际 协议 声明,本文仅仅作为个人mark,排版并不如原文,为了更爽的阅读体验建议到原文查看. 延伸阅读: Go GC: Prioritizing low latency and simplicity 用任何带 GC 的语言最后都要直面 GC 问题.在以前学习 C# 的时候就被迫读了一大堆 .NET Garbage Collection 的文档.最近也学习了一番 golang 的垃圾回收机制,在这里记录一下. 常

搞懂Go垃圾回收

本文主要介绍了垃圾回收的概念,Golang GC的垃圾回收算法和工作原理,看完本文可以让你对Golang垃圾回收机制有个全面的理解.由于本人不了解其他语言的GC,并未对比其他语言的垃圾回收算法,需要的可以自行Google. 什么是垃圾回收 垃圾回收(英语:Garbage Collection,缩写为GC),在计算机科学中是一种自动的存储器管理机制.当一个计算机上的动态存储器不再需要时,就应该予以释放,以让出存储器,这种存储器资源管理,称为垃圾回收.垃圾回收器可以让程序员减轻许多负担,也减少程序员

从golang的垃圾回收说起(上篇)

本文来自网易云社区 1 垃圾回收中的重要概念 1.1 定义 In computer science, garbage collection (GC) is a form of automatic memory management. The garbage collector, or just collector, attempts to reclaim garbage, or memory occupied by objects that are no longer in use by the

An Introduction to Garbage Collection(垃圾回收简介)

1. Introduction 2. Principles 3. Advantages 4. Disadvantages 5. 常见的垃圾回收技术 5.1. 跟踪式垃圾回收 5.1.1. 基本算法 5.2. 引用计数垃圾回收 5.3. 分代垃圾回收 5.4. 对象使用类型分析 6. 参考 团队项目中用Go的地方越来越多,最近打算在业余时间好好看看Golang的虚拟机实现.像Java/C#/Python一样,Go的优势之一就是将开发人员从繁重的内存管理中解放 出来,本文对编程语言中常见的垃圾回收技

垃圾回收机制汇总

平时在写代码的时候,关注的是写出能实现业务逻辑的代码,因为现在计算机的内存也比较宽裕,所以写程序的时候也就没怎么考虑垃圾回收这一方面的知识.俗话说,出来混总是要还的,所以既然每次都伸手向内存索取它的资源,那么还是需要知道什么时候以及如何把它还回去比较好. Python 垃圾回收机制--->https://blog.csdn.net/cn_wk/article/details/51707206python采用计数引用(Reference Counting)为主,来跟踪和回收垃圾.采用标记清除(Ma

V8垃圾回收?看这篇就够了!

什么是内存管理 内存管理是控制和协调应用程序访问电脑内存的过程.这个过程是复杂的,对于我们来说,可以说相当于一个黑匣子. 当咱们的应用程序运行在某个操作系统中的时候,它访问电脑内存(RAM)来达成下列几个功能: 运行需要执行的字节码(代码) 存储程序运行时候所需的数据 加载程序运行所需的运行时环境 上面用来存储程序运行时所需的数据,就是下面要说的堆(heap)和栈(stack). 栈(stack) 顾名思义,是一种先进后出的结构,参考一下餐盘的取和放. 俄罗斯套娃,我这不禁 栈的特点 由于先进后

Java垃圾回收原理(2)

Java虚拟机采用一种自适应的垃圾回收技术.依据的思想:对任何"活"的对象,一定能最终追溯到其存活在堆栈或静态存储区之中的引用.这个引用链条可能会穿过数个对象层次.由此,如果从堆栈和静态存储区开始,遍历所有的引用,就能找到所有活的对象.对于发现的每个引用,必须追踪它所引用的对象,然后是此对象所包含的所有的引用,如此反复进行,直到"根源于堆栈和静态存储区的引用"所形成的网络全部被访问为止.至于如何处理找到存活的对象,取决于不同的Java虚拟机的实现.有一种名为停止-复