这是我参与「第五届青训营 」伴学笔记创作活动的第 9 天
性能优化及自动内存管理
- 业务层优化
- 针对特点场景,具体问题,具体分析
- 容易获得较大性能效益
- 语言运行时优化
- 解决更通用的性能问题
- 考虑更多场景
- Tradeoffs
- 数据驱动
- 自动化性能分析工具-pprof
- 依靠数据而非猜测
- 首先优化最大瓶颈
自动内存管理
基本概念:
- 动态内存
- 程序在运行时根据需求动态分配的内存:malloc()
- 自动内存管理-垃圾回收:由程序员语言的运行时系统管理动态内存
- 避免手动内存管理,专注于实现业务逻辑
- 保证内存使用的正确性和安全性
这些与Java的虚拟机的GC类似不多概述。
分代GC进行垃圾回收
在年轻代中大部分垃圾都要会被回收,存活的对象很少,所以使用复制的方法只需要复制一小部分,这样回收效率就会提高。在老年代中大部分对象都会存活,只有一小部分回收所以应该使用标记清除,但是长时间运行后,会造成大量的存储碎片,所以还要使用复制整理的方式来充分利用空间。
引用计数
在代码执行的过程中就完成了内存的管理。但是缺点就是大量使用原子操作导致开销较大,每个对象引入都会额外引入内存。而且无法回收环形的数据结构,循环引用会导致引用不为0,导致始终无法被回收。
Go 内存分配
类似于java中的G1垃圾回收机制。
在运行过程中,对象分配十分频繁,而且小对象占比比较多。大部分的对象分配都小于80b
对象创建优化
如果分配空间内部存在存活对象可能导致整个空间都不能被及时释放。为了解决这个问题使用copyGC来实现垃圾回收机制。