当前位置: 首页 > news >正文

Go语言内存管理详解-学习笔记

1 自动内存管理

1.1 相关概念

  • Mutator:业务线程,分配新对象,修改对象指向关系
  • Collector:GC线程,找到存活对象,回收死亡对象的内存空间
  • Serial GC:只有一个collector(需要暂停)
  • Parallel GC:支持多个collectors同时回收的GC算法(需要暂停)
  • Concurrent GC:mutator(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,用于无指针小对象分配。使用三个指针维护GAB:base、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,反之则没有逃逸

http://www.lryc.cn/news/20548.html

相关文章:

  • Geospatial Data Science (4): Spatial weights
  • JUC-Synchronized相关内容
  • 【c++】文件操作(文本文件、二进制文件)
  • 带你了解IP报警柱的特点
  • 一步步教你电脑变成服务器,tomcat的花生壳设置(原创)
  • Python 卷积神经网络 ResNet的基本编写方法
  • 【索引】什么是索引
  • 【算法刷题】动态规划算法题型及方法归纳
  • PolarDB数据库的CSN机制
  • 使用kubeadm 部署kubernetes 1.26.1集群 Calico ToR配置
  • Servlet笔记(11):Servletcontext对象
  • EM算法是什么
  • C++---线性dp---方格取数(每日一道算法2023.2.25)
  • 《第一行代码》 第八章:应用手机多媒体
  • C++设计模式(20)——迭代器模式
  • 戴尔Latitude 3410电脑 Hackintosh 黑苹果efi引导文件
  • 一起Talk Android吧(第五百零四回:如何调整组件在约束布局中的位置)
  • ssh连不上实验室的物理机了
  • selinux讲解
  • 【计算机网络】TCP底层设计交互原理
  • Kotlin1.8新特性
  • 【Java8】
  • 阿里 Java 程序员面试经验分享,附带个人学习笔记、路线大纲
  • 十大算法基础——上(共有20道例题,大多数为简单题)
  • 【PAT甲级题解记录】1018 Public Bike Management (30 分)
  • SpringCloud————Eureka概述及单机注册中心搭建
  • 原生django raw() 分页
  • Android 9.0 Settings 搜索功能屏蔽某个app
  • SQL性能优化的47个小技巧,果断收藏!
  • SE | 哇哦!让人不断感叹真香的数据格式!~