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
参考
golang垃圾回收和SetFinalizer的更多相关文章
- 【GoLang】golang垃圾回收 & 性能调优
golang垃圾回收 & 性能调优 参考资料: 如何监控 golang 程序的垃圾回收_Go语言_第七城市 golang的垃圾回收(GC)机制 - 两只羊的博客 - 博客频道 - CSDN.N ...
- Golang——垃圾回收GC(2)
1 垃圾回收中的重要概念 1.1 定义 In computer science, garbage collection (GC) is a form of automatic memory manag ...
- golang垃圾回收
常见GC算法 我总结了一下常见的 GC 算法.分别是:引用计数法.Mark-Sweep法.三色标记法.分代收集法. 1. 引用计数法 原理是在每个对象内部维护一个整数值,叫做这个对象的引用计数,当对象 ...
- Go笔记-垃圾回收集和SetFinalizer
[垃圾回收] 1- Go的开发者也不用写代码来释放程序中不再使用的变量和结构占用内存,Go中有独立的进程,垃圾回收器(GC),处理这些事情.它会搜索不再使用的变量然后释放它们. 2- ...
- Golang垃圾回收机制(一)
原文: http://legendtkl.com/2017/04/28/golang-gc/ 1. Golang GC 发展 Golang 从第一个版本以来,GC 一直是大家诟病最多的.但是每一个版本 ...
- Golang垃圾回收机制(二)
原文:https://blog.csdn.net/qq_15427331/article/details/54613635 Go语言正在构建的垃圾收集器(GC),似乎并不像宣传中那样的,技术上迎来了巨 ...
- Golang——垃圾回收GC
Go 垃圾回收原理 Golang源码探索(三) GC的实现原理 引用计数:对每个对象维护一个引用计数,当引用该对象的对象被销毁时,引用计数减1,当引用计数器为0是回收该对象. 优点:对象可以很快的被回 ...
- golang 垃圾回收机制
用任何带 GC 的语言最后都要直面 GC 问题.在以前学习 C# 的时候就被迫读了一大堆 .NET Garbage Collection 的文档.最近也学习了一番 golang 的垃圾回收机制,在这里 ...
- golang 垃圾回收 gc
http://ruizeng.net/golang-gc-internals/ 摘要 在实际使用go语言的过程中,碰到了一些看似奇怪的内存占用现象,于是决定对go语言的垃圾回收模型进行一些研究.本文对 ...
随机推荐
- 清理SuperMap三维缓存
一.iclient三维插件浏览器端缓存 方法1:遍历users子文件夹,发现指定目录有supermap,即删除 @echo offtitle 清理三维缓存@echo 开始清理三维缓存...for /f ...
- Codeforces 1100 F - Ivan and Burgers
F - Ivan and Burgers 思路:线性基+贪心,保存线性基中每一位的最后一个 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #p ...
- less点滴
1.简单的嵌套: less中显示: css中显示 2.作为值的变量: less中: @green: #801f77;@baise:white; header,footer{ background: @ ...
- AngularJS服务及注入--Provider
Provider简介 在AngularJS中,app中的大多数对象通过injector服务初始化和连接在一起. Injector创建两种类型的对象,service对象和特别对象. Service对象由 ...
- caffe提取每一层中的特征,在matlab或python查看
参考博客: http://blog.csdn.net/abc8730866/article/details/52522843 http://blog.csdn.net/lijiancheng0614/ ...
- Caused by: java.lang.NoClassDefFoundError: com/google/common/base/MoreObjects
环境:jdk1.8 开发工具:IDEA 说明:今天在做springboot集成swagger2的时候,在启动程序的时候,报错 报错信息: Error starting ApplicationConte ...
- 第8天【文件系统挂载、ext文件系统及read命令、Linux RAID、lvm应用】
文件系统挂载与管理工具(01)_recv 文件系统管理: 将额外文件系统与根文件系统某现存的目录建立关联关系,进而使得此目录作为其他文件访问入口的行成为挂载: 解除此关联关系的过程 吧设备关联挂载点: ...
- java数学函数Math类中常用的方法
Math类提供了常用的一些数学函数,如:三角函数.对数.指数等.一个数学公式如果想用代码表示,则可以将其拆分然后套用Math类下的方法即可. Math.abs(12.3); ...
- R语言安装xlsx包,读入excel表格
开学的时候,男神给了数据(.xlsx格式)让用R语言分析分析,作为编程小白,读了一天都没读近R,更别提如何分析了. 现在小伙伴们都喜欢读txt 和csv格式的,好多xlsx的表格读不进R,将xlsx格 ...
- 配置JAVA开发环境
以下为搭建java的开发环境...... 第一步:安装JDK 1. 了解一下 JVM(Java Virtual Machine—Java虚拟机) JRE(Java Runtime Environmen ...