年度最佳【golang】sync.Pool详解

最近在工作中碰到了 GC 的问题:项目中大量重复地创建许多对象,造成 GC 的工作量巨大,CPU 频繁掉底。准备使用 sync.Pool 来缓存对象,减轻 GC 的消耗。为了用起来更顺畅,我特地研究了一番,形成此文。本文从使用到源码解析,循序渐进,一一道来。本文基于 Go 1.14是什么sync.Pool 是 sync 包下的一个组件,可以作为保存临时取还对象的一个“池子”。个人觉得它的名字有一定的误导性,因为 Pool 里装的对象可以被无通知地被回收,可能 sync.Cache 是一个更合适的...阅读全文

Segmentfault 2020-09-08 11:32:32 去去1002

【golang】1.14的sync.Pool原理分析

参考 Golang 的 sync.Pool设计思路与原理,这篇文章基于1.12版本对golang的sync.Pool实现原理进行了分析。关于sync.Pool的使用场景、基本概念的理解可以参考前面的文章。在1.12中sync.Pool的设计思路简单总结一下:将 G 和 P 绑定,设置与P绑定的M禁止抢占以防止 G 被抢占。在绑定期间,GC 无法清理缓存的对象。每个p都有独享的缓存队列,当g进行sync.pool操作时,先找到所属p的private,如果没有对象可用,加锁从 shared切片里获取...阅读全文

Segmentfault 2020-09-03 14:32:44 去去1002

记一次使用 frp 完成内网服务器实现穿透全过程

写在前面 因之前内网穿透一直使用的 ngrok,使用的 ngrok 1.x 版本的最新 1.7.1,而1.7.1有严重的内存泄露问题,再加上 1.x 早已不在维护,ngrok 2.x 后已经不再开源,所以考虑换一个内网穿透工具。 一、业务场景 装备情况如下: 一台阿里云服务器(Windows Server 2012)、公网IP。 三台内网服务器,其中两台 Windows Server,一台 CentOS。 一个一级域名,已解析到公网IP。 需求:通过域名或IP可访问三台内网部署的 http 服务...阅读全文

简书 2020-09-03 11:32:48 六小六的世界

【golang】sync.Mutex互斥锁的实现原理

sync.Mutex是一个不可重入的排他锁。 这点和Java不同,golang里面的排它锁是不可重入的。当一个 goroutine 获得了这个锁的拥有权后, 其它请求锁的 goroutine 就会阻塞在 Lock 方法的调用上,直到锁被释放。数据结构与状态机sync.Mutex 由两个字段 state 和 sema 组成。其中 state 表示当前互斥锁的状态,而 sema 是用于控制锁状态的信号量。type Mutex struct { state int32 sema uint32 } 需要...阅读全文

Segmentfault 2020-09-07 23:32:32 去去1002

【golang】内存分配详解

简介golang runtime的另外一大主题就是内存分配器,内存分配策略与协程栈、堆、GC等话题息息相关。类似于TC malloc的思想;使用span机制来减少内存碎片,每个span至少为一个页(go中的一个page为8KB),且大小为页的整数倍,每一种span用于一个范围的内存分配需求. 比如16-32byte使用分配32byte的span, 112-128使用分配128byte的span.一共有67个size范围, 8byte-32KB;每个size有两种类型(scan和noscan, 表...阅读全文

Segmentfault 2020-09-06 11:32:33 去去1002

Go 每日一库之 jobrunner

简介我们在 Web 开发中时常会遇到这样的需求,执行一个操作之后,需要给用户一定形式的通知。例如,用户下单之后通过邮件发送电子发票,网上购票支付后通过短信发送车次信息。但是这类需求并不需要非常及时,如果放在请求流程中处理,会影响请求的响应时间。这类任务我们一般使用异步的方式来执行。jobrunner就是其中一个用来执行异步任务的 Go 语言库。得益于强大的cron库,再搭配jobrunner的任务状态监控,jobrunner非常易于使用。快速使用本文使用 Go Modules。创建目录并初始化:...阅读全文

Segmentfault 2020-09-06 18:32:32 darjun

在本地运行 fyne 官网

简介要深入学习和理解一个框架,官方文档是必须要仔细阅读的。fyne 官网有非常系统和详尽的文档。官方网站:https://fyne.io/。有时候我们会有这样一个需求——离线查看文档。我经常乘坐高铁来往杭州、上海两地,地铁、高铁上通常网络比较差,甚至没有网络。为此我特地去研究了一番怎样搭建 fyne 离线文档。首先,我找到了 fyne 官方网站的 GitHub 仓库,网址为https://github.com/fyne-io/developer.fyne.io。很快我发现 fyne 官网是采用 ...阅读全文

Segmentfault 2020-09-07 13:32:34 darjun

go| go 性能优化入门之「Go代码重构:23倍的性能爆增」实践

最近在整理以前攒的 go 语言学习资料 -- 可能很多人都和我一样, 随手一个收藏, 不动手也不深入, 然后就过去了. 这次从故纸堆里扫出来, 当然不能错过 资料: blog 地址: https://www.cnblogs.com/sunsky303/p/9296188.html 原作者已经提供好了代码: https://github.com/Deleplace/forks-golang-good-code-bad-code 学习到的知识: 使用 go test 进行 单测/压测 使用 go t...阅读全文

简书 2020-09-02 20:32:43 daydaygo

年度最佳【golang】GMP调度详解

Golang最大的特色可以说是协程(goroutine)了, 协程让本来很复杂的异步编程变得简单, 让程序员不再需要面对回调地狱, 虽然现在引入了协程的语言越来越多, 但go中的协程仍然是实现的是最彻底的. 这篇文章将通过分析golang的源代码来讲解协程的实现原理.这个系列分析的golang源代码是Google官方的实现的1.9.2版本, 不适用于其他版本和gccgo等其他实现, 运行环境是Ubuntu 16.04 LTS 64bit.核心概念要理解协程的实现, 首先需要了解go中的三个非常重...阅读全文

Segmentfault 2020-09-06 16:32:33 去去1002

年度最佳【golang】内存分配详解

这篇文章主要介绍Go内存分配和Go内存管理,会轻微涉及内存申请和释放,以及Go垃圾回收。从非常宏观的角度看,Go的内存管理就是下图这个样子,我们今天主要关注其中标红的部分。友情提醒:文章有点长,建议先收藏,后阅读,绝对是学习内存管理的好资料。本文基于go1.11.2,不同版本Go的内存管理可能存在差别,比如1.9与1.11的mheap定义就是差别比较大的,后续看源码的时候,请注意你的go版本,但无论你用哪个go版本,这都是一个优秀的资料,因为内存管理的思想和框架始终未变。Go这门语言抛弃了C/C...阅读全文

Segmentfault 2020-09-06 13:32:33 去去1002

记不住Git那么命令?动图展示10个Git常用命令,建议收藏!

git merge、git rebase、git reset、git revert、git fetch、git pull、git reflog……你知道这些 git 命令执行的究竟是什么任务吗?如果你还有些分不清楚,那千万不能错过这篇文章。在本文中,熟知 JavaScript、TypeScript、GraphQL、Serverless、AWS、Docker 和 Golang 的 21 岁年轻软件顾问 Lydia Hallie 通过动图形式直观地介绍了这些常用 git 命令的工作过程,包你过目不忘...阅读全文

简书 2020-09-02 16:32:56 风平浪静如码

适合创业的golang微服务框架go-zero + 金光灿灿的gorm V2实践

为什么使用go-zero 可以有第三个选择 golang圈子不大,微服务框架框架屈指可数:除了go-micro、go-kit,几乎没有其他选择。go-zero为此提供第三个可能。 go-micro 对webapi支持并不友好,需要运行micro指令,难以定制 创业产品需要一款支持业务成长的框架 我们到底需要什么样的框架?我们需要一款可以支持业务成长的框架!产品运营初期,比如需求验证阶段,我们并不需要采取微服务架构,因为运营成本太高。一款单体应用足以应付。随着业务发展,微服务成为必要,此时我们希望...阅读全文

简书 2020-09-02 16:32:49 非正式解决方案

初学心得 | Rust学习笔记

作者:谢敬伟,江湖人称“刀哥”,20年IT老兵,数据通信网络专家,电信网络架构师,目前任Netwarps开发总监。刀哥在操作系统、网络编程、高并发、高吞吐、高可用性等领域有多年的实践经验,并对网络及编程等方面的新技术有浓厚的兴趣。近段时间在学习研究Rust。都说Rust学习曲线陡峭,感觉果然如此。之前学习Go,基本上没有专门去看语法,只是在需要的时候上网查一查,再花点时间看看大型的开源软件项目,差不多就可以写生产级别的代码了。而Rust则不然,至少本人花了差不多两三周的时间专门学习语法,然而去看...阅读全文

Segmentfault 2020-09-05 21:32:33 Netwarps

Golang圣经练习题及答案(二)

> 本文参考 [嗨客网](https://haicoder.net) Golang [实战](https://haicoder.net/case/index.html) # **Golang圣经练习题及答案(二)** # **前言** 本篇文章是关于 Golang 圣经的题目以及详细的解题思路,每道题都附有答案链接,答案解题的每个步骤到运行结果都十分详细,十分适合小白拿来练习,也十分适合准备面试的各位复习下 Golang,这篇文章我会不断更新,题目都是对应 Golang 圣经...阅读全文

Go语言中文网 2020-09-02 14:13:13 haicoder_ibai

常量与运算符 golang

在上一篇博文当中最后一句有讲到,当你需要强制转换一个 int 值为一个字符串类型,得到的值会和想象中有些出入。 func main() { a := 65 var b = string(a) fmt.Println(b) } 这里打印出来的是大写字母 A,这是为什么?为什么不是一个值为 65 的字符串? 当你强制转换时,系统会认为你想要得到是 ASCII 表对应的字符串,刚好 65 对应的是大写 A。 如何能够得到一个字符串的65,这就需要再引入一个包了,strconv 包, strconv.I...阅读全文

简书 2020-09-02 11:34:41 与子笑

NodeMax(N3)——实力让数字经济的春风播撒全球

在传统金融业转型升级的今天,区块链技术作为曾经名躁一时的比特币的底层技术,开始逐渐进入大众的视野。业内人士开始探讨这一技术在金融创新过程中广泛应用的可能性,以及它可能给行业带来的颠覆性改变。基于区块链的数字货币龙头比特币,自主健康跑了十年,价值上涨480万倍。顺应时代发展需求,必得投资者的心NodeMax数字经济生态公链基于比特币诞生,完全沿用比特币经济模型。比特币是数字货币行业最成功的加密货币,这主要的原因在于其搭建的顶级经济模型,整个生态自主健康运营,矿工持续激励,整个生态体系一路稳健上涨,...阅读全文

简书 2020-09-02 11:34:30 天眷_1e03

关于Golang的那些事(三) -- 基本数据

说完了变量与声明,接下来要讲讲Golang里面的数据类型,Golang里面的数据类型分成基础类型、聚合类型、引用类型和接口类型。基础类型包括数字、字符串和布尔型;聚合类型包含数组和结构体,它是通过组合各种简单类型而得到的更复杂的数据类型;引用类型包含指针、slice、map、函数以及通道;接口类型将会在后面的篇章进行讲解。学到C语言的人都知道,在计算机的世界里,分为整数、浮点数和复数,在Go里面也一样,分为整数、浮点数和复数。 对于整数来说有两种类型:有符号整数和无符号整数,有符号整数有8位、1...阅读全文

简书 2020-09-02 10:32:44 llkevin13579

ARTS 第16周 | Redis 作者如何评价 Redis 持久化 | Go 代码规范

ARTSARTS 是陈浩(网名左耳朵耗子)在极客时间专栏里发起的一个活动,目的是通过分享的方式来坚持学习。每人每周写一个 ARTS:Algorithm 是一道算法题,Review 是读一篇英文文章,Technique/Tips 是分享一个小技术,Share 是分享一个观点。本周内容本周的 ARTS 你将看到:Redis 作者是如何评价 Redis 的持久化的.使用 golint 和 go vet 规范你的代码.Algorithm本周竟然没有算法题, 看来博主坚持不下去了.Review 文章推荐本...阅读全文

Segmentfault 2020-09-05 21:32:32 澎湃哥

面试被问Tomcat整体架构设计,我哭的像个孩子

推荐阅读: 这套Github上40K+star学习笔记,可以帮你搞定95%以上的Java面试 毫不夸张的说,这份SpringBoot学习指南能解决你遇到的98%的问题 最全面试题新鲜出炉:70+算法题、近30种大厂面试笔试常考知识点 最近在研究 Tomcat ,感觉整体设计确实值得学习。今天先分享一篇文章带大家简单看看。后面,参考 Tomcat 整体设计自己争取能够手写一个轻量的 web 服务器。 使用 golang 语言 实现一个 http server,只需几行代码即可,为何用 java 实...阅读全文

简书 2020-09-01 23:32:55 老男孩_Misaya

【Go语言入门系列】(八)Go语言是不是面向对象语言?

【Go语言入门系列】前面的文章:【Go语言入门系列】(五)指针和结构体的使用【Go语言入门系列】(六)再探函数【Go语言入门系列】(七)如何使用Go的方法?1. Go是面向对象的语言吗?在【Go语言入门系列】(七)如何使用Go的方法?这一文中已经介绍了方法的概念,但这个方法实际上并不是面向对象中的方法。方法实际上是用户给其定义的类型的增加的新行为,实际上也是个函数。关于这个问题,官方文档中有回答:Yes and no. Although Go has types and methods and ...阅读全文

Segmentfault 2020-09-05 15:32:32 行人观学