“这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天”
1 性能优化
1.1 性能优化的层面
1.2 性能优化与软件质量
2 自动内存管理
-
1、动态内存
- 程序在运行时根据需求动态分配的内存,例如Malloc方法;
-
2、自动内存管理(垃圾回收):由程序语言的运行时系统管理动态内存
- 避免手动内存管理,专注于业务逻辑
- 保证内存使用的正确性和安全性,
- 例如C++中的重复释放内存(double-free problem)和引用已经释放的内存空间(use-after-free problem)
-
3、三个任务
- 为新对象分配空间;
- 找到存活对象;
- 回收死亡对象的内存空间;
2.1 相关概念
- GC(Garbage Collection)垃圾回收
有三种GC,分别如下图所示,
其中Concurrent GC的难点在于右上角图所示,在GC过程中,业务线程还在继续,可能有新的对象产生;
此时需要讲已标记的对象指向的对象也标记上,不然就会被当作死亡对象清理掉;
Concurrent GC必须感知对象指向关系的改变!
- 评价GC算法
- 1)安全性;
- 2)吞吐率;(花在GC上的时间)
- 3)暂停时间;
- 4)内存开销;
2.2 追踪垃圾回收
- 对象被回收的条件:指针指向关系不可达的对象;
- 过程如下:
- 1)标记根对象;
- 2)标记:可达对象;
- 3)清理:所有不可达对象
- 1、清理过程有三种方式:
- 1)copying GC;将存活对象复制到另外内存空间;
- 2)mark-sweep GC;将死亡对象标记为可分配;
- 3)mark-compact GC;移动并整理存活对象;
2.3 分代GC(Generational GC)
根据对象的声明周期,使用不同的标记和清理策略
2.4 引用计数
- 缺点:
- 1)因为要保证引用值的正确性,原子操作开销大;
- 2)环形结构;
- 3)内存开销(引用至所占内存);
- 4)当一个链过大,回收内存时可能会引发暂停;