花都电子商务网站建设,html5 wordpress,婚庆素材网站免费,公司做网站那家好1 自动内存管理
1.1 相关概念
Mutator#xff1a;业务线程#xff0c;分配新对象#xff0c;修改对象指向关系Collector#xff1a;GC线程#xff0c;找到存活对象#xff0c;回收死亡对象的内存空间Serial GC#xff1a;只有一个collector#xff08;需要暂停#…1 自动内存管理
1.1 相关概念
Mutator业务线程分配新对象修改对象指向关系CollectorGC线程找到存活对象回收死亡对象的内存空间Serial GC只有一个collector需要暂停Parallel GC支持多个collectors同时回收的GC算法需要暂停Concurrent GCmutator(s)和collector(s)可以同时执行不需要暂停1.2 追踪垃圾回收 对象被回收的条件指针指向关系不可达的对象 标记可达对象清理所有不可达对象 1.3 分代GC 很多对象在分配出来后很快就不再使用了 对年轻和老年的对象制定不同的GC策略降低整体内存管理的开销 1.4 引用计数 存活条件当且仅当引用数大于0 2 Go内存管理及优化
2.1 Go内存分配 提前将内存分块。首先向OS申请一大块内存然后将内存划分为若干个大块再将大块划分成特定大小的小块用于对象分配有的大块用来分配不包含指针的对象GC不需要扫描有的大块分配包含指针的对象GC需要扫描。 缓存策略。每个P包含一个缓存用于为P上的G分配对象如果缓存分配完毕向下一级缓存申请未分配的大块。 2.2 Go内存管理优化 对象分配中小对象占比较高 2.3 优化方案Balanced GC 每个G都绑定一大块内存称作GAB用于无指针小对象分配。使用三个指针维护GABbase、end、top 带来的问题内存被延迟释放 解决办法移动GAB中存活的对象到另一个GAB中然后释放原GAB。 3 编译器和静态分析
3.1 编译器的结构 3.2 静态分析 不执行程序代码推导程序的行为分析程序的性质。 控制流程序执行的流程 控制流图示例数据流数据在控制流上的传递 3.3 过程内分析和过程间分析 过程内分析仅在函数内部进行分析 过程间分析考虑过程调用时参数传递和返回值的数据流和控制流 过程间分析是个难点问题因为需要同时分析控制流和数据流 4 Go编译器优化
4.1 函数内联 将被调用函数的函数体的副本替换到调用位置上同时重写代码以反映参数的绑定
优点
消除函数调用开销将过程间分析转化为过程内分析
缺点
函数体变大icache不友好编译生成的Go镜像变大4.2 Beast Mode 调整函数内联的策略使更多函数被内联更多对象不逃逸可以分配在栈上 4.3 逃逸分析 分析代码中指针的动态作用域指针在何处可以被访问 若发现指针p在当前作用域s
作为参数传递给其他函数传递给全局变量传递给其他的goroutine传递给已逃逸的指针指向的对象则指针p指向的对象逃逸出s反之则没有逃逸