这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
- 为了进行系统处理能力、减少不必要的消耗,挖掘计算机算力,达到以较低资源实现较高的性能
- 性能优化方面主要从以下角度进行:
- 业务层优化:结合场景具体问题具体实现
- 语言运行时的优化
-
解决性能问题 -
考虑不同场景下的运行性能 -
工具Tradeoffs - 数据驱动方面:
-
利用性能分析工具:PPROF -
结合实验数据分析优化 -
优化最大瓶颈
- 自动内存管理
- 系统运行时自动对内存进行管理:大致分为以下方面:
-
新对象分配空间 -
找到存活对象 -
回收死亡对象的内存空间
- 相关概念介绍:
- Mutator:分配新对象,修改对象之间的关系
- Collector:GC线程,找到存活对象,回收死亡对象的内存
- Serial GC:只有一个Collector
- Parallel GC:支持多个Collector运行回收内存
- Concurrent GC:Mutator和Collector可以同时运行,但Collector必须感知对象之间的关系,避免在后续回收内存时出现错误
- 评价gc算法的指标:
- 安全性:对存活对象不能进行回收
- 吞吐率:1-GC运行时间/系统运行时间
- 暂停时间:业务是否感知
- 内存开销:GC元数据开销
- 常见的GC算法:追踪垃圾回收和引用计数
- 追踪垃圾回收:
- 对象回收的条件:指针关系不可达对象
- 从根对象开始标记(全局变量、局部变量、常量、线程栈),标记所有可达对象,将未被标记的进行清除,清除方式有:
- 存活对象移动到另一个内存空间
- 死亡对象标记为可分配
- 移动整理存活对象
- 分代gc
-
很多对象再分配出去以后不再使用,根据使用次数定义新旧对象, -
新对象一般是刚分配,且使用次数不多,将新对象复制到另一个空间合适 -
旧对象使用次数多,可以使用标记法 - 引用计数:
-
每个对象都有一个自己被引用的数目 -
存活条件:被引用的次数>0
6. 内存管理与优化
- 为对象在heap上分配内存
- 提前将内存进行分块
- 步骤如下:
-
调用mmap()向os预先申请内存 -
将申请到的内存进行分块, mspan -
将分块后的内存分为特定大小的块 -
noscan mspan:分配不包含指针的对象 -
scan mspan:分配包含指针的对象 - 对象分配:根据对象大小,分配合适的块