第三节,第四节课学习|青训营笔记

63 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第2篇笔记

第三节课

image.png 当package的名称和package的函数返回类型一样时,可以省略类型信息

WJ.png

U3H.png

2X.png

PF.png

注意defer是后进先出 J{V51VVC1_XKOYTKA(D)F%D.png _KS_DNK0T824HHR26_GGJ3.png

debug.Stack()包含的调用堆栈信息,方便定位具体问题代码 @ENYDJ9NY}0RQGYNS1USF9.png

使用make()初始化切片时提供容量信息,性能更佳 A.png

原来切片由大量的元素构成,在原来切片基础上切片,不会创建新的底层数组,而底层数组在内存中占据大量空间,无法释放,因此可以使用copy代替二次切片。 两部分代码使用不同逻辑取slice的最后两位数创建新数组,统计输出内存占用信息。

5{)ATAD4XAAXIW2$4GXQH1L.png

{Z@SN`WOR5{@H.png @B8UMMXWGN.png G.png

实现Set,可以考虑用map来代替,对于这个场景,只需要用到map的键,不需要值,即使将map的值设置为bool类型也会占据一个字节空间 T5$I29%W4.png

VJ9_XB0.png 1Y7QF4M.png

->>golang pprof 实战 这个和课上讲解的性能优化是同一个,包含使用pprof排查CPU占用,内存占用,频繁内存回收,协程的泄露,锁的争用,阻塞操作。

第四节课

Mutator 业务线程,分配新对象,修改对象指向关系 Collector GC线程,找到存货对象,回收死亡对象的内存空间 AZO{5SO0W~}2AL0EG873.png

评价GC算法:
安全性:不能回收存货对象,是基本要求。
吞吐率:1-GC时间/程序执行总时间
暂停时间:stop the world(STW)业务是否感知
内存开销 GC元数据开销
追踪垃圾回收:回收条件是指针指向关系不可达的对象
标记根对象如静态变量,全局变量,常量,线程栈等
清理不可达对象:将存活对象复制到另外的内存空间(copying GC),将死亡对象的内存标记为“可分配”(mark-sweep GC),移动并整理存活对象(Mark-compact)
根据对象的生命周期,使用不同的标记和清理策略
分代GC
分代假说
一般直觉上,很多对象在分配出来后很快不再次使用了,每个对象都有年龄,即经历过GC次数。
对于年轻代:使用常规的对象分配,由于存活对象少,可以采用上述的copying collection,GC吞吐率高
对于老年代:对象趋向一直活着,反复复制开销大,采用mark-sweep collection 引用计数