当前位置: 首页 > 网络应用技术

进行性能优化 - 自动记忆管理|青年训练营说明

时间:2023-03-08 16:43:13 网络应用技术

  什么是性能优化?

  提高软件系统处理能力,减少不必要的消耗,并全面发掘计算机计算能力。

  为什么要优化性能?

  改善用户体验

  有效利用资源:降低成本并提高效率 - 非常小的优化乘以大型机器将显着提高性能和成本节省

  绩效优化级别:业务层优化和语言运行时级优化业务代码SDK基本库语言操作:GC,调度程序和其他OS

  1.英语和英语的概念:

  2.内存泄漏内存泄漏是指程序中动态分布的桩内存,因为程序未释放或无法释放,导致系统内存浪费,从而造成严重的后果,例如减慢程序操作甚至系统崩溃。

  内存泄漏会导致内存溢出,无法继续申请内存空间,并且内存已满。

  3.自动内存管理动态内存:程序在运行过程中根据需求动态分配的内存

  自动内存管理(垃圾回收):编程语言运行时系统管理动态内存

  它可以有效地避免手动内存管理,因此我们专注于编写代码时实现业务逻辑

  确保记忆使用的正确性和安全性:dubl

  三个任务:为新对象分配空间

  找到幸存的物体

  回收死亡物体的记忆空间

  4.在TheGo中自动内存管理:业务线程,分配新对象,修改指向该关系的对象

  收集器:GC线程,找到幸存的物体,回收死亡物体的记忆空间

  串行GC:只有一个收藏家

  平行GC:支持多收集器GC算法

  并发GC:突变器和收集器可以同时执行

  5.两个常见的GC算法跟踪垃圾回收

  参考计数

  2.1算法思想回收的条件:诗指向无法到达的对象

  确定是否可以达到对象,因为一旦无法使用此对象,就可以立即被GC恢复。因此,我们如何判断对象是否可以达到?

  第一步是标记根对象,也就是说,在当前函数堆栈中找出所有全局变量以及可以到达的变量,常数等。

  从标记的数据开始的第二步,进一步标记了它们的可访问变量,依此类推,专业术语称为传输关闭。

  清理所有无法到达的人:根据对象的生命周期,三种方法使用不同的标记和清理策略

  1.标签拷贝拷贝幸存的对象到另一个内存空间(复制GC)

  2. Mark-Clear-Mark将死亡对象的记忆作为分布(Mark-S-S-S-扫描GC):使用自由列表来管理免费内存

  3.标签 - 组织 - 摩尔压缩GC:标记 - 连接GC):

  2.2划分GC(世代GC)跟踪垃圾收集算法在回收少量垃圾时非常有效,尤其是用于复制回收算法。目前,通过分区,可以累积长寿数据。通过这种方式,将复制回收算法用于Young Data可以大大提高效率。

  世代假设:大多数物体死亡

  设计原则:收集器将堆分为不同的区域,然后根据年龄根据年龄分配回收对象。对象年龄是指他们经历过GC的次数。

  不同年龄的对象应具有不同的GC策略:

  年轻一代:常规对象分配;因为生存对象很少,所以您可以使用标记策略。GC吞吐量很高

  旧一代:物体往往还活着,并且重复的复制开销更大。您可以使用明确的策略

  2.3三色标记算法)Golang使用的垃圾回收算法是一种三色标记方法,改进了传统的标记清除率和混凝土GC算法。

  原则如下:

  第一步是创建一个集合:白色,灰色和黑色;

  第二步是将所有对象放入白色集合中。

  第三步是从根节点穿越所有对象,并从白色集合中放置从白色集合中的遍历对象(注意:此处灰色集合是根节点的对象);

  第四步是穿越灰色集合,而灰色对象引用的对象(注意:这是指灰色对象引用的所有对象,包括灰色节点间接引用的那些对象)。灰色对象放在一个黑色收藏,直到灰色中没有对象为止;

  第五步是更改测试屏障的对象(写入栏),然后重复上述操作(注意:因为标记和用户程序是平行的,所以在上一步可能有新的对象分配。问题);

  第六步是收集所有白色物体(垃圾)。

  缺点:程序中的垃圾速度可能大于垃圾收集速度,这将导致该程序中越来越多的垃圾被收集。

  每个对象都有许多与之关联的引用。

  物体的生存条件:仅当引用数量大于0时

  优点:内存管理的操作扩展到程序执行过程

  内存管理不需要了解运行时的实现详细信息

  缺点:参考计数的维护很大:参考计数操作的原子和可见性通过原子操作

  无法恢复环数据结构-Weak参考

  内存费用:每个对象引入的其他内存空间存储的参考数量

  回收记忆时,可能仍会导致悬架

  4.1块目标:在堆上分配内存

  提前将内存块放置:调用系统调用MMAP(),申请从OS中申请大量内存;将其分成大块,将其称为MSPAN,然后将大块分成一小部分特定尺寸,根据对象,根据对象,根据对象的大小,选择最合适的块返回。有两种类型的小块类型,,,,

  Noscan MSPAN:分配不包括指针的对象,GC不需要扫描

  扫描MSPAN:分配指针的对象,GC需要扫描

  4.2在GMP模型中,每个P包含一个用于快速分布的MCACHE,用于分布与P上p的对象;Mcache管理了一组MSPAN MSPAN

  4.3优化方案(字节):较小的GC被绑定到一大件内存(1KB),称为Goroutine分配缓冲区(GAB)

  GAB用于Noscan类型的小物体:<128 b

  GAB是GO内存管理的对象。

  本质上:将多个小对象的分布合并为大对象分配

  4.4逃生分析分析代码动态范围:在哪里可以访问指针

  一般想法:从对象分配办公室开始,沿着控制流,观察对象的数据流,如果您发现指针P出现在当前域中:

  传递到其他功能作为参数

  传递到全球变量

  传递给其他gor绕

  传递到逃生指针的对象指向

  指针P的对象逃脱了,否则无法从S中逃脱。

  堆栈上分配了无法证实的对象。堆栈上对象的分配和回收快速:移动SP;可以减少堆分布并减轻GC的负担。

  原始:https://juejin.cn/post/7097609603461939231