青训营笔记

90 阅读3分钟

后端Go语言基础笔记:

这是我参与【第五届青训营】伴学笔记创作活动的第3天。

在今天,通过学习Go语言原理与基础,在第八小节的中,掌握了Go语言中性能调优的流程等:

业务服务:

性能优化流程:

·建立服务性能评估手段 ·分析性能数据,定位性能瓶颈 ·重点优化项改造 ·优化效果验证

优化效果验证:

·重复压测验证 ·上线评估优化效果 ·关注服务监控 ·逐步放量 ·收集性能数据

进一步优化,服务整体链路分析:

规范上游服务调用接口,明确场景需求分析链路,通过业务流程优化提升服务性能

基础库优化:

AB实验SDK的优化

·分析基础库核心逻辑和性能瓶颈 ·设计完善改造方案 ·数据按需获取 ·数据序列化协议优化 ·内部压测验证 ·推广业务服务落地验证

Go语言优化

编译器&运行时优化

·优化内存分配策略 ·优化代码编译流程,生成更高效的程序 ·内部压测验证 ·推广业务服务落地验证

优点 ·接入简单,只需要调整编译配置 ·通用性强

在第九小节学习的内容如下:

自动内存管理:

·动态内存 ·程序在运行时根据需求动态分配的内存: malloc()

自动内存管理-相关概念:

Mutator: 业务线程,分配新对象,修改对象指向关系 Collector: GC 线程,找到存活对象,回收死亡对象的内存空间 Serial GC: 只有一个 collector Parallel GC: 支持多个 collectors 同时回收的 GC 算法 Concurrent GC: mutator(s) 和 collector(s) 可以同时执行

追踪垃圾回收:

·对象被回收的条件: 指针指向关系不可达的对象 ·标记根对象: 静态变量、全局变量、常量、线程栈等 ·标记: 找到可达对象 求指针指向关系的传递闭包: 从根对象出发,找到所有可达对象 ·清理: 所有不可达对象 将存活对象复制到另外的内存空间(Copying GC) 将死亡对象的内存标记为“可分配”(Mark-sweep GC) 移动并整理存活对象(Mark-compact GC)

分代GC:

·分代假说(Generational hypothesis): most objects die young ·Intuition: 很多对象在分配出来后很快就不再使用了 ·每个对象都有年龄:经历过 GC 的次数 ·目的: 对年轻和老年的对象,制定不同的 GC 策略,降低整体内存管理的开销 ·不同年龄的对象处于 heap 的不同区域

年轻代(Young generation) ·常规的对象分配 ·由于存活对象很少,可以采用 copying collection ·GC 吞吐率很高 老年代(Old generation) ·对象趋向于一直活着,反复复制开销较大 ·可以采用 mark-sweep collection

引用技术:

·每个对象都有一个与之关联的引用数目 ·对象存活的条件: 当且仅当引用数大于 0 ·优点: 内存管理的操作被平摊到程序执行过程中 内存管理不需要了解 runtime 的实现细节: C++ 智能指针 (smart pointer) ·缺点: 维护引用计数的开销较大: 通过原子操作保证对引用计数操作的原子性和可见性 无法回收环形数据结构 - weak reference 内存开销: 每个对象都引入的额外内存空间存储引用数目 回收内存时依然可能引发暂停