golang 关闭gc 并手动gc_Golang 防内存泄漏编码原则
(给Go开发大全
加星标)
来源:zmlgo
https://www.cnblogs.com/share-ideas/p/11365511.html
【导读】go 编程中,如果写法不当,可能引发内存泄漏。本文介绍了一些 coding 原则和详细示例。
1、给系统打压力,内存占用增大,但停止打压后,内存不能降低,则可能有内存泄漏。
2、top不能实时反映程序占用内存,因Go向系统申请内存不使用后,并不立即归还系统。
3、程序占用系统内存、Go的堆内存、实际使用内存:从系统申请的内存会在Go的内存池管理,整块的内存页,长时间不被访问并满足一定条件后,才归还给操作系统。又因为有GC,堆内存也不能代表内存占用,清理过之后剩下的,才是实际使用的内存。
4、调用runtime.ReadMemStats可以看到Go的内存使用信息。
5、使用go tool pprof -inuse_space http://127.0.0.1:6060/debug/pprof/heap?debug=2得到更细信息,其中HeapInuse为实际内存使用量。
6、第一条原则是,绝对不能由消费者关channel,因为向关闭的channel写数据会panic。正确的姿势是生产者写完所有数据后,关闭channel,消费者负责消费完channel里面的全部数据。
func produce(ch chan { defer close(ch) // 生产者写完数据关闭channel ch }func consume(ch chan T) { for _ = range ch { // 消费者用for-range读完里面所有数据 }}ch := make(chan T)go produce(ch)consume(ch)
7、第二条原则是,利用关闭channel来广播取消动作,并可配合着WaitGroup类来使用。
func produce(ch chanchan struct{}) { select { case ch case // 用select同时监听cancel动作 }}func consume(ch chan T, cancel chan struct{}) { v := err := doSomeThing(v) if err != nil { close(cancel) // 能够通知所有produce退出 return }}for i:=0; i<10; i++ { go produce()}consume()
8、通过chann发信号来关闭协程。
func (m *TtlMap) clear() { for { select { // 关闭 case return //定期清理... } }}
9、MapWarpper作为局部变量时,定义它的函数结束后,MapWarpper的生命周期已结束,Gc会将其回收。Gc回收MapWarpper时执行了onGarbageCollect()函数,将Ttlmap的clear协程关闭,进而将Ttlmap回收。
strcut TtlMap { ... stop chan bool}// 包裹定义struct MapWarpper { *TtlMap}func New() *MapWarpper { map := &TtlMap{ ... } go map.clear() // 包一层 mw := &MapWarpper{map} // 重点在此:设置被回收时操作 runtime.SetFinalizer(mw, onGarbageCollect) return mw}
10、通过context包来避免内存泄漏。
func main() { ctx, cancel := context.WithCancel(context.Background()) ch := func(ctx context.Context) chan int { ch := make(chan int) go func() { for i := 0; ; i++ { select { case return case ch } } } () return ch }(ctx) for v := range ch { fmt.Println(v) if v == 5 { cancel() break } }}
- EOF -
推荐阅读(点击标题可打开)
1、用etcd做go-micro的服务发现
2、k8s调度的优先级及抢占机制源码分析
3、Golang 的 sync.Pool设计思路与原理
如果觉得本文不错,欢迎转发推荐给更多人。
分享、点赞和在看
支持我们分享更多好文章,谢谢!
golang 关闭gc 并手动gc_Golang 防内存泄漏编码原则相关推荐
- golang 关闭gc 并手动gc_Golang垃圾回收 屏障技术
作者:镜萱 垃圾回收(Garbage Collection,简称GC)是编程语言中提供的自动的内存管理机制,自动释放不需要的对象,让出存储器资源,无需程序员手动执行. Golang中的垃圾回收主要应用 ...
- golang 关闭gc 并手动gc_Golang 大杀器之跟踪剖析 trace
Go语言中文网,致力于每日分享编码.开源等知识,欢迎关注我,会有意想不到的收获! 在 Go 中有许许多多的分析工具,在之前我有写过一篇 Golang 大杀器之性能剖析 PProf 来介绍 PProf, ...
- Android—内存泄漏、GC及LeakCanary源码解析
内存抖动:内存频繁的分配和回收,频繁的GC会导致UI卡顿,严重的时候导致OOM. 内存泄露:程序在向系统申请分配内存空间后(new),在使用完毕后未释放.结果导致一直占据该内存单元,我们和程序都无法再 ...
- python的gc模块_Python的内存泄漏及gc模块的使用分析
一般来说在Python 中,为了解决内存泄漏问题,采用了对象引用计数,并基于引用计数实现自动垃圾回收.由于Python 有了自动垃圾回收功能,就造成了不少初学者误认为自己从此过上了好日子,不必再受内存 ...
- Android内存优化(三)避免可控的内存泄漏
相关文章 Android性能优化系列 Java虚拟机系列 前言 内存泄漏向来都是内存优化的重点,它如同幽灵一般存于我们的应用当中,有时它不会现身,但一旦现身就会让你头疼不已.因此,如何避免.发现和解决 ...
- Netty防止内存泄漏措施
谨以此文献给李林锋即将新生的爱女. 1. 背景 1.1 直播平台内存泄漏问题 某直播平台,一些网红的直播间在业务高峰期,会有 10W+ 的粉丝接入,如果瞬间发生大量客户端连接掉线.或者一些客户端网络 ...
- Android内存泄漏的检测流程、捕捉以及分析
https://blog.csdn.net/qq_20280683/article/details/77964208 Android内存泄漏的检测流程.捕捉以及分析 简述: 一个APP的性能,重度关乎 ...
- App优化以及内存泄漏溢出优化
目录介绍 1.OOM和崩溃优化 1.1 OOM优化 1.2 ANR优化 1.3 Crash优化 2.内存泄漏优化 2.0 动画资源未释放 2.1 错误使用单利 2.2 错误使用静态变量 2.3 han ...
- Android:最全面详细的性能优化攻略(含内存优化、内存泄漏、绘制优化、布局优化、图片优化、APK优化、多线程优化、列表优化等)
前言:佛教中有一句话:初学者的心态,拥有初学者心态是件了不起的事情.真正的大师永远怀有一颗学徒的心. 一.概述 在Android中,性能优化是细分领域中最难且也是知识面涉及最深和最广的方向之一. 更快 ...
最新文章
- ASP.NET MVC 5 - 将数据从控制器传递给视图
- Python 字符串大小写转换
- matlab求负数分数幂问题
- 任正非之女姚安娜正式出道
- ENSP如何开启服务器的http_Centos\Liunx如何安装MySQL?
- 关于C#_ArrayList的两篇文章
- 自然语言处理——TF-IDF文本表示
- 六安:在线监测 精准调控 构建智慧城市节水管理平台
- (转) windows 下ORA-12514:TNS 监听问题
- Android实战开发-Kotlin教程(入门篇 1.0)
- 瑞吉外卖项目1 + 源码
- Python机器学习之决策树(使用西瓜数据集构建决策树,并将其可视化,graphviz程序下载)
- 离散小波变换wavedec matlab,MATLAB小波变换指令及其功能介绍(超级有用)
- 关于elementplus 的:suffix-icon=“Search不显示问题记录
- SmartBi V9系统运维总结
- 解决Chrome浏览器不能访问https网站的问题 阿星小栈
- oracle逗号隔开行转列_oralce逗号分割变多行-Oracle
- 无法登录学校网站的解决办法
- 利用集合进行数组的排序
- 百度云主机只能访问首页,bcloud_nginx_user.conf配置
热门文章
- bzoj4565 [HAOI2016]字符合并 结论+状压+区间dp
- 【Python】Python3.7.3 - 闭包Closure技术
- go语言实战_字节跳动年薪50W抢Go开发人才,你还在问该不该学?
- torch的DataLoader 浅析
- accept 返回0_使用Vue3.0新特性造轮子 WidgetUI3.0 (Upload上传文件组件)
- python小球弹弹弹_python实现小球弹跳效果
- Unreal4 IOS上使用第三方库和C++11 特性问题解决
- Linux下安装配置Jenkins
- Xcode8 + Swift3.0 创建一个app基础框架
- 基于linux实现DNS互联网的搭建