Go-知识并发控制Channel
channel 作为协程间通信的类型,用来在协程间传递信息是基本能力,而通过灵活的使用 channel ,可以实现各种各样复杂的并发控制。
channel 作为协程间通信的类型,用来在协程间传递信息是基本能力,而通过灵活的使用 channel ,可以实现各种各样复杂的并发控制。
栈上分配内存比在堆中分配内存有更高的效率。栈上分配的内存不需要GC处理。对上分配的内存使用完毕会交给GC处理。逃逸分析的目的是决定分配地址是栈还是堆。逃逸分析在编译阶段完成。在编程的时候,应该尽可能避免产生内存逃逸。传递指针可以减少底层值的赋值,可以提高效率,但是如果赋值的数据量小,由于指针传递会产生逃逸,则可能会使用堆,也可能增加GC的负担,所以指针传递不一定是高效的。
GC性能与对象数量负相关,对象越多,GC性能越差,对程序影响越大。GC性能优化的思路之一就是减少对象分配的个数,比如对象复用或者使用大对象组合多个小对象等等。内存逃逸会产生一些隐式的内存分配,也有可能成为GC的负担。_go stw
Go 程序启动时申请一大块内存,并划分成 spans, bitmap, arena 区域arena 区域按页划分成一个个小块span 管理一个或多个页mcentral 管理多个 span 供线程申请使用mcache 作为线程私有资源,资源来源于 mcentral。_go内存分配
本文详细介绍了Go语言中的协程概念,对比了进程和线程,探讨了协程在高并发中的优势,包括线程池问题和协程调度器模型,以及Go调度策略如队列轮转、系统调用、工作量窃取和抢占式调度。最后,分析了GOMAXPROCS对性能的影响。
- select仅能操作chan.- 每个case语句仅能处理一个chan,要么是读chan,要么是写chan.- 多个case语句的执行顺序是随机的。- 存在default语句,select将不会阻塞。- 使用select读取chan时,应该尽可能检查读取是否成功,确定数据是否可信。_go select chan
sync map 将互斥锁内置实现并发读写,将互斥锁的范围仅仅限定在dirty表,减少锁等待和锁调用,提升性能。因为dirty表和read表总是在争取保持一致,所以大部分读场景下,read表就能查询到数据,适合读多写少。sync map 中read表和dirty表都会持有key,所以内存占用上会比较大,而且在写多读少的场景下,因为既要遍历read表,又要遍历dirty表,性能上会比较慢。_go sync.map
Go 语言中map的底层使用Hash表实现,并发不安全。_go map[string]
在Go语言的设计中, string 通常指的是字符串的字面量,而且字符串一般情况下存储的位置也是只读,而不是堆或者栈(这里可能一定程度上借鉴了汇编之类的语言)。所以设计为string不可修改。当string不可修改后,带来的好处是string变得非常轻量,而且可以放心的在go-routine中进行传递,不用考虑并发冲突和内存拷贝。_go string 双引号转单引号
Go 语言的struct与Java中的class类似,可以定义字段和方法,但是不能继承。a int需要注意的是,在Go里面,访问权限是通过name的大小写指定的,小写表示包内可见,如果是大写则表示包外可见。同样的,如果创建的struct想让包外可见,那么必须是大写开头。id int在Go里面一般不会区分函数和方法,或者更好理解的话,可以认为方法是受限的函数,限制了函数调用者,那么就是方法。同样的,上述方法包内可见。上述方法虽然包外可见,但是没有意义,因为tes。_go struct