这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
追求性能
什么是性能优化? 性能优化是提升软件效率,减少不必要消耗
为什么要做呢? 可以让刷抖音更思华,双十一不卡顿
性能优化有以下几个层面
- 业务层优化
- 语言运行优化
优化是考数据驱动的,也就是pprof,首先优化最大的性能瓶颈
软件质量只管重要,需要保证接口稳定的情况下,改进具体实现. 文档应该记录 做了什么,什么没做,能达到什么样的效果. 还应该实现可观测这一点,也就是有必要的日志输出
自动内存管理
动态内存是程序运行时动态的内存分配,也就是malloc()
垃圾回收,是语言运行时管理动态内存
- 可以让我们专注于业务逻辑
- 保证安全性和准确性
自动内存管理的核心任务是
- 为新对象分配空间
- 回收死亡对象
- 寻找存活对象
名词定义:
- Mutator: 代表业务线程,分配新对象
- Collector: GC线程,寻找存活对象,回收死亡对象空间
GC类型:
- Serial GC, 单线程GC
- Parallel GC. 多线程gc(多个collector同时回收)
- Concurrent GC, 内存的分配和回收并行
GC
评价GC算法有以下方法
- 安全性, 不能回收存货的对象
- 吞吐率, 花在gc上的时间
- 暂停时间
- 内存开销
一般回收的条件是指针指向不可达的对象
垃圾回收遵循以下步骤
- 标记根对线, 比如全局变量,静态变量
- 找到可达对象,从根对象出发,找到所有可达的对象
- 清理不可达对象
清理不可达对象有以下几种方法
- 将存活对象复制到另外的内存空间
- 将死亡对象的内存标记为可分配
- 移动并整理存活对象
分代GC: 对每一个对象标记有年龄,年龄是对象经过GC的次数, 对老的对象和年轻的对象
进行不同的GC策略.
老的对象,偏向一直活着,复制开销较大, 采用mark-sweep
新的对象,存活对象很少, 采用copy collection算法