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

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

  1. 【GoLang】golang垃圾回收 & 性能调优

    golang垃圾回收 & 性能调优 参考资料: 如何监控 golang 程序的垃圾回收_Go语言_第七城市 golang的垃圾回收(GC)机制 - 两只羊的博客 - 博客频道 - CSDN.N ...

  2. Golang——垃圾回收GC(2)

    1 垃圾回收中的重要概念 1.1 定义 In computer science, garbage collection (GC) is a form of automatic memory manag ...

  3. golang垃圾回收

    常见GC算法 我总结了一下常见的 GC 算法.分别是:引用计数法.Mark-Sweep法.三色标记法.分代收集法. 1. 引用计数法 原理是在每个对象内部维护一个整数值,叫做这个对象的引用计数,当对象 ...

  4. Go笔记-垃圾回收集和SetFinalizer

    [垃圾回收]     1- Go的开发者也不用写代码来释放程序中不再使用的变量和结构占用内存,Go中有独立的进程,垃圾回收器(GC),处理这些事情.它会搜索不再使用的变量然后释放它们.     2- ...

  5. Golang垃圾回收机制(一)

    原文: http://legendtkl.com/2017/04/28/golang-gc/ 1. Golang GC 发展 Golang 从第一个版本以来,GC 一直是大家诟病最多的.但是每一个版本 ...

  6. Golang垃圾回收机制(二)

    原文:https://blog.csdn.net/qq_15427331/article/details/54613635 Go语言正在构建的垃圾收集器(GC),似乎并不像宣传中那样的,技术上迎来了巨 ...

  7. Golang——垃圾回收GC

    Go 垃圾回收原理 Golang源码探索(三) GC的实现原理 引用计数:对每个对象维护一个引用计数,当引用该对象的对象被销毁时,引用计数减1,当引用计数器为0是回收该对象. 优点:对象可以很快的被回 ...

  8. golang 垃圾回收机制

    用任何带 GC 的语言最后都要直面 GC 问题.在以前学习 C# 的时候就被迫读了一大堆 .NET Garbage Collection 的文档.最近也学习了一番 golang 的垃圾回收机制,在这里 ...

  9. golang 垃圾回收 gc

    http://ruizeng.net/golang-gc-internals/ 摘要 在实际使用go语言的过程中,碰到了一些看似奇怪的内存占用现象,于是决定对go语言的垃圾回收模型进行一些研究.本文对 ...

随机推荐

  1. IOS 下载app

    ---------------------------------------------------------------------------------------------------- ...

  2. Python 条件控制

    Python  条件控制 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. 可以通过下图来简单了解条件语句的执行过程: if 语句 Python中if语 ...

  3. [Angular] 'providedIn' for service

    There is now a new, recommended, way to register a provider, directly inside the @Injectable() decor ...

  4. springboot启动配置原理之三(事件监听机制)

    ApplicationContextInitializer public class HelloApplicationContextInitializer implements Application ...

  5. hdoj5754

    题意:略 国王和骑士用记忆搜索,注意骑士的移动是x-2,y-1或x-1,y-2.车是NIM博弈,后是威佐夫博弈.注意威佐夫博弈中两堆石子有大小之分,而输入不一定小在前. #include <io ...

  6. 『TensorFlow』第三弹_可视化框架介绍_悄悄问圣僧

    添加记录节点 -> 汇总记录节点 -> run汇总节点 -> [书写器生成]书写入文件 [-> 刷新缓冲区] 可视化关键点: 注意, 1.with tf.name_scope( ...

  7. flask请求上下文

    先看一个例子: #!/usr/bin/env python # -*- coding:utf-8 -*- import threading # local_values = threading.loc ...

  8. java中double和float精度丢失问题及解决方法

    在讨论两位double数0.2和0.3相加时,毫无疑问他们相加的结果是0.5.但是问题总是如此吗? 下面我们让下面两个doubles数相加,然后看看输出结果: @Test public void te ...

  9. 【转载】koa相关知识(来自官网)

    什么是Koa? koa 是由 Express 原班人马打造的,致力于成为一个更小.更富有表现力.更健壮的 Web 框架.使用 koa 编写 web 应用,通过组合不同的 generator,可以免除重 ...

  10. java常见3种文件上传速度对比和文件上传方法详细代码

    在java里面文件上传的方式很多,最简单的依然是FileInputStream.FileOutputStream了,在这里我列举3种常见的文件上传方法代码,并比较他们的上传速度(由于代码是在本地测试, ...