自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

惜暮

github.com/louyuting

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

golang sync.Mutex互斥锁的实现原理数据结构与状态机Lock(1)正常模式(2) 饥饿模式Unlocksync.Mutex是一个不可重入的排他锁。 这点和Java不同,golang里面的排它锁是不可重入的。当一个 goroutine 获得了这个锁的拥有权后, 其它请求锁的 goroutine 就会阻塞在 Lock 方法的调用上,直到锁被释放。数据结构与状态机sync.Mutex 由两个字段 state 和 sema 组成。其中 state 表示当前互斥锁的状态,而 sema 是用于控制

2020-05-23 14:18:30 247

原创 伪共享与CPU cache line

伪共享与CPU cache line

2020-05-21 21:30:46 110

原创 golang sync.Pool在1.14中的优化

golang sync.Pool在1.14中的优化sync.Pool在1.12中实现的原理简述1.14 Pool 数据结构poolChainpoolChain.popHead()poolChain.pushHead()poolChain.popTail()poolDequeue数据结构pack/unpackpoolDequeue.pushHeadpoolDequeue.popHeadpoolDequeue.popTail数据结构总结Pool.PutPool.Getvictim的GC优化总结本文基于gol

2020-05-20 16:08:28 263

原创 Caffeine高性能缓存设计

Caffeine高性能缓存设计是否需要缓存选择合适的缓存Caffeine 的使用Caffeine高性能设计W-TinyLFU 淘汰算法的整体设计LRU和LRU的缺点TinyLFU统计频率Count–Min Sketch算法频率统计Count–Min Sketch的保新机制增加一个小window淘汰策略expireEntries 方法evictEntries 方法Pacer in TinyLFU异步...

2020-04-25 22:24:14 479

原创 位运算之补码

位运算之补码补码理解计算机数值的加法利用补码可以用加法来计算减法位运算在我们开发工作中经常遇到,在一些性能优化的场景经常会出现位运算的场景,比如Java的HashMap里面就是不是通过取余操作而是通过 (n - 1) & hash 来计算key的index的(table array的length是2的n次方)。程序中的整数在计算机内存中都是以二进制的形式存在的,位运算就是直接对整数在...

2020-04-22 19:21:21 155

原创 常用缓存淘汰算法LFU、LRU、2Q、ARC

常用缓存淘汰算法LFU、LRU、2Q、ARC、FIFOLFULRULFULRU

2020-04-07 22:23:01 302

原创 Etcdv3 client watcher原理分析

Etcdv3 client watcher原理分析背景etcdv3 client watcher整体架构源码分析背景最近在实现高可用流控防护组件sentinel的golang版本 ,扩展数据源这一块,在golang生态里面是etcd是非常重要的一个角色。需求是这样,每个集成sentinel的app instance会与etcd建立长连接来做动态数据源的更新。由于动态数据源的类型有多个,在Jav...

2020-03-28 17:17:07 246

原创 Java map和golang map的一些点

Java map和golang map的一些点hash函数Javagolang内存存储模型:JavaConcurrentHashMapJDK7的分段锁思想JDK8的红黑树golang背景:Java 1.8.40Golang 1.13.5hash函数Java哈希函数代码如下:static final int hash(Object key) { int h; ...

2020-02-11 22:38:14 195

原创 golang 对象(struct) hash原理

golang 对象hash原理map里面的key的hash是怎么实现的golang里面的对象的hash原理map里面的key的hash是怎么实现的源码:src/runtime/map.gogolang的map是内置关键字,不管是get还是set都需要通过key的hash找到对应的存储实体。具体的hash过程如下代码:type maptype struct { typ _ty...

2020-02-04 22:56:36 707

原创 golang interface 与 反射

golang interface 与 反射golang interface 使用场景golang interface 数据结构golang interface 一些使用场景原理函数参数是 interface 的成本interface{}和带方法的interface的赋值过程动态类型与动态分发是如何实现的,动态分发什么时候进行,并且有什么样的调用成本如何进行类型转换如何进行断言,断言的成本有多高为什...

2020-02-01 21:45:28 619

原创 golang type assertion and unsafe.Pointer 性能对比

type assertion performance类型断言性能对比 unsafe.Pointer

2020-01-17 21:41:42 278

原创 golang atomic.Value实践以及原理

golang atomic.Value实践以及原理数据结构StoreLoad一些总结最近一个项目中某个对象需要持有一个统计对象,并且需要能够原子的更新这个统计对象(并发读写场景下),避免data race。为了避免对象的copy, 肯定是要持有这个统计对象的指针了。 此外,这个统计对象其实是统计的模型,需要能够随时替换成其余的统计实现。所以很自然的选用了 interface{}来保存。type...

2020-01-15 23:18:59 1812

原创 golang sync.Map 原理以及性能分析

go sync.Map 原理分析go mapsync.Map数据结构go 并发安全的mapsync.Map适用的适用场景

2020-01-12 11:25:29 1395

原创 golang 记一次data race排查过程

golang 记一次data race排查过程

2020-01-04 17:48:20 422

原创 golang unsafe.Pointer使用原则以及 uintptr 隐藏的坑

uintptr GC 非类型安全指针unsafe.Pointer 使用模式reflect.SliceHeader的缺陷

2020-01-04 12:14:34 996

原创 golang data race 竞态条件

golang data race, race condition

2019-12-20 00:37:20 224

原创 golang垃圾回收浅析

GC常见垃圾回收算法引用计数标记清除三色标记算法复制算法分代收集算法golangGC的发展golang GC 三色标记主要流程写屏障三色标记状态的记录扫描与对象元信息GC 的触发gcTriggerHeapgcTriggerTimegcTriggerCycle辅助GCGC Pacer根对象标记队列GC的流程Phase1:标记前准备(STW)Phase2 并发标记Phase3:标记终止(STW)Phase4:并发回收

2019-12-09 23:50:36 509

原创 golang 内存分配深度分析

golang runtime的另外一大主题就是内存分配器,内存分配策略与协程栈、堆、GC等话题息息相关。

2019-12-01 21:09:13 669 1

原创 golang error处理

golang error处理error 是什么?存在的问题舍弃的try提案社区对于error堆栈解决方案go 1.13 的Error 升级本文主要讲解golang中error的使用以及原理。主要包括以下话题。error是什么error 面临的问题舍弃的try提案社区对于error堆栈解决方案go 1.13 对于error的提升error 是什么?在 golang 中我们使用 e...

2019-11-04 21:55:32 375

原创 golang 逃逸分析与栈、堆分配分析

golang 逃逸分析与栈、堆分配分析Question什么是堆?什么是栈?逃逸分析在什么阶段确立逃逸为什么需要逃逸go怎么确定是否逃逸第一:编译器命令第二:反编译命令查看实际案例1.指针2. 不确定类型总结我们在写 golang 代码时候定义变量,那么一个很常见的问题,申请的变量保存在哪里呢?栈?还是堆?会不会有一些特殊例子?这篇文章我们就来探索下具体的case以及如何做分析。还是从实际使用场...

2019-10-31 23:47:47 1582

原创 golang defer性能损耗和实际使用场景

golang defer性能损耗和实际使用场景基准测试defer开销实际场景结论我们常常听到别人说:”defer 在栈退出时执行,会有性能损耗,尽量不要用。“ 前面的博客 defer原理 我们分析了defer延迟调用的底层实现原理 。下面我们就基于那篇原理分析文章,来分析一下 defer 延迟调用的性能损耗。基准测试package mainimport ( "sync" "testi...

2019-10-28 00:05:30 706

原创 GC:标记清除算法

本文主要介绍标准的标记-清除算法的过程,优缺点,以及做的一些优化过程。GC Mark-Sweep Algorithm1.GC标记清除算法1.1 标记阶段1.2 标记阶段算法1.3 清除阶段算法1.4 已回收空闲内存空间再分配1.5 合并(内存碎片整理)2.GC标记清除算法的优缺点3. GC标记清除算法的优化3.1 multi-size空闲链表优化分配速度1.GC标记清除算法标记清除算法主...

2019-10-27 22:51:41 352

原创 golang panic和recover 实现原理

golang panic和recover 实现原理思考1.为什么go 进程会终止2. 为什么不会中止运行3.不设置 defer 行不4. 为什么起个 goroutine 就不行数据结构panic恢复 recover panicpanic 抛出总结:这篇文章是系列文章中的第二篇,系列文章主要包括:golang defer的原理golang panic和recover()函数的原理(包括gol...

2019-10-27 22:49:52 1515 2

原创 golang defer原理

golang defer原理defer的特性1. 延迟调用2. 后进先出3. defer 作用域4. 异常处理这篇文章是系列文章的第一篇,系列文章主要包括:golang defer的原理golang panic和recover()函数的原理(包括golang对于错误处理方式)defer性能损耗的讨论以及最重要的应用场景defer在golang 1.13 上的性能defer的特性首...

2019-10-25 00:12:48 719

原创 Golang的内存对齐

Golang的内存对齐测试demo:内存对齐为什么要关心对齐为什么要做对齐默认对齐系数成员对齐:整体对齐对齐规则分析流程成员对齐整体对齐结果小结巧妙的结构体分析流程成员对齐整体对齐结果总结测试demo:我们先来看一个demo:type Part1 struct { a bool b int32 c int8 d int64 e byte}我们先来看一下Part1里面的各个数据...

2019-10-14 22:01:40 235

原创 golang类型转换与类型断言

golang类型转换与断言主要内容:golang语言特点:强类型;

2019-09-23 16:47:12 126

原创 go tool 命令

go 编译命令go toolgo buildgo testgo tool(1) go tool compile -S main.go反编译代码为汇编代码go buildgo build 命令用于编译我们指定的源码文件或代码包以及它们的依赖包。(2) go build -gcflags=-m main.go打印出编译器逃逸分析的过程,使用 -m 参数。go testgo test...

2019-09-22 17:27:02 1753

原创 golang汇编语言基础

Go汇编语言是一个不可忽视的技术。因为哪怕只懂一点点汇编,也便于更好地理解计算机原理,也更容易理解Go语言中动态栈/接口等高级特性的实现原理。Stacks由于 Go 程序中的 goroutine 数目是不可确定的,并且实际场景可能会有百万级别的 goroutine,runtime 必须使用保守的思路来给 goroutine 分配空间以避免吃掉所有的可用内存。也由于此,每个新的 gorouti...

2019-09-22 17:06:19 1791

原创 golang的值接收者和指针接收者的区别

golang的值接收者和指针接收者的区别方法值接收者和指针接收者两者分别在何时使用方法方法能给用户自定义的类型添加新的行为。方法和函数的区别在于方法有一个接收者,给一个函数添加一个接收者,那么它就变成了方法。接收者可以是值接收者,也可以是指针接收者。我们在调用方法的时候,值类型既可以调用值接收者的方法,也可以调用指针接收者的方法;指针类型既可以调用指针接收者的方法,也可以调用值接收者的方法...

2019-09-17 23:05:56 993 2

原创 Golang map实践以及实现原理

Map实践以及实现原理实例实例

2019-09-17 10:36:24 2395 2

原创 golang unsafe实践与原理

golang unsafe指针类型unsafe为什么有 unsafeunsafe实现原理指针类型unsafe为什么有 unsafeunsafe 实现原理unsafe 使用实践获取slice长度获取map长度Offsetof 获取成员偏移量string 和 slice 的零拷贝相互转换总结指针类型关于指针的好处这里就不描述了。golang是一种强类型的语言,gola...

2019-09-01 23:30:24 269

原创 golang slice实践以及底层实现

slice实践以及底层原理Topic:slice是传值还是传地址slice作为函数入参的各种坑切片的数据结构切片的创建切片的扩容切片的拷贝

2019-08-16 00:15:59 1299 12

原创 Golang 的 sync.Pool设计思路与原理

sync.Pool设计思路与原理使用实例底层数据结构PutGetRuntime 垃圾回收Hook总结使用实例sync.Pool设计的目的是用来保存和复用临时对象,以减少内存分配,降低CG压力。Pool对外暴露的主要有三个接口:func (p *Pool) Get() interface{}func (p *Pool) Put(x interface{})New func() int...

2019-05-29 13:44:49 2513 5

原创 Fasthttp里面 goroutine pool 实现原理

Fasthttp里面 goroutine pool 实现原理应用实例源码分析调用链路分析workerPool 的 start 和 stopworkerPool 的 Serve逻辑架构图这篇文章主要讲解fasthttp 这个http库关于协程池做的优化原理;应用实例fasthttp 是一个非常优秀的web server框架,github上的benchmark号称比官方的net/http快1...

2019-05-26 14:26:51 969

原创 goroutine pool的简单实现

goroutine pool的简单实现golang web server原理粗糙版本的goroutine pool升级版 goroutine pool这篇文章从go提供的web server的出发,理解go web server的实现方式,提出goroutine pool的重要性,然后自己实现一个简单版本的goroutine poolgolang web server原理我们先来看一个非...

2019-05-26 00:22:32 552

原创 【树结构】Trie字典树

字典树概念使用场景:实现1. 数据模型2. 添加字符串3. 删除操作4. 获取单词频率5. 测试概念Trie树的名字有很多,比如字典树,前缀树等等。下面我们有and,as,at,cn,com这些关键词,那么如何构建trie树呢?从上面的图中,我们或多或少的可以发现一些好玩的特性。 第一:根节点不包含字符,除根节点外的每一个子节点都包含一个字符。 第二:从根节点到某一节点,路径上经...

2019-03-26 00:06:54 242

原创 【树结构】平衡二叉树

平衡二叉树平衡二叉树定义数据模型定义(go):旋转1. 左左情况(左子树的左边节点)2.右右情况(右子树的右边节点)3. 左右情况(左子树的右边节点)3. 右左情况(右子树的左边节点)新增节点删除节点平衡二叉树定义前面我们说过,二叉查找树不是严格的O(logN),导致了在真实场景中没有用武之地,谁也不愿意有O(N)的情况发生。当有很多数据灌到我的树中时,我肯定会希望最好是以“完全二叉树”的形式...

2019-03-25 22:47:23 216

原创 golang syscall原理

Golang System call1.入口2.系统调用管理3.runtime 中的 SYSCALL4.用户代码的系统调用和调度交互entersyscall和exitsyscall的pipelineentersyscallexitsyscallentersyscallblock5. 总结这篇文章主要是分析在golang里面用户态进行系统调用时候的一些原理,主要关注点将会放在system call...

2019-03-07 16:44:50 4128

原创 TCMalloc : Thread-Caching Malloc 论文翻译

TCMallocMotivationOverviewSmall Object AllocationLarge Object AllocationSpansDeallocation(释放)Central Free Lists for Small ObjectsGarbage Collection of Thread Caches本文主要是对于TCMalloc内存分配论文的学习, 英文论文Thre...

2019-02-01 22:31:12 305

原创 Golang-Scheduler原理解析

本文主要分析Golang里面对于协程的调度原理,本文与Golang的memory allocation、channel、garbage collection这三个主题是紧密相关的,本文scheduler作为系列的第一篇文章。文章大体上的思路是这样的:section1:主要图示和文字介绍scheduler的原理;section2:从源码和模型的角度介绍scheduler原理;section...

2019-01-16 23:35:47 7093 10

提示
确定要删除当前文章?
取消 删除