内存管理 | 青训营笔记

96 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第7天

一、本堂课重点内容:

  • 本堂课的知识要点有哪些?
  • 1.自动内存管理
  • 2.Go语言的内存管理
  • 如何提高代码性能是十分重要的问题,这节课老师带我们细看Go语言的内存管理机制,从内至外理解然后优化代码。

二、详细知识点介绍:

1.自动内存管理 1.1动态内存 概念

1.1.1 程序在运行时根据需求动态分配的内存:malloc ()

·自动内存管理(垃圾回收)︰由程序语言的运行时系统管理动态内存

1.1.2避免手动内存管理,专注于实现业务逻辑

·保证内存使用的正确性和安全性:

1.1.3三个任务 ·为新对象分配空间·找到存活对象 ·回收死亡对象的内存空间

1.2 自动内存管理 概念

1.2.1自动内存管理-相关概念 Mutator:业务线程,分配新对象,修改对象指向关系

.Collector: GC线程,找到存活对象,回收死亡对象的内存空间

.Serial GC:只有一个collector

. Parallel GC:支持多个collectors同时回收的GC算法·Concurrent GC: mutator(s)和collector(s)可以同时执行

. Collectors必须感知对象指向关系的改变!

1.2.3 如何评价GC算法 ·安全性(Safety):不能回收存活的对象基本要求 ·吞吐率(Throughput): 1 -O~E行花在GC 上的时间 ·暂停时间(Pause time): stop the world (STW)业务是否感知·内存开销(Space overhead) GC元数据开销 ·追踪垃圾回收(Tracing garbage collection) ·引用计数(Reference counting)

1.3 追踪垃圾回收 ·对象被回收的条件:指针指向关系不可达·标记根对象 ·静态变量、全局变量、常量、栈等·标记:找到可达对象 ·求指针指向关系的传递闭包: 清理:所有不可达对象 ·将存活对象复制到另外的内存空间(Copying GC)将死亡对象的内存标记为“可分配“(Mark-sweep GC)·移动并整理存活对象(Mark-compact GC) ·根据对象的生命周期,使用不同的标记和清理策略

2.Go的内存管理及优化

2.1 Go内存分配一分块 提前分配空间有利于提高代码性能,减少重新分配的操作

·目标:为对象在heap 上分配内存·提前将内存分块

·调用系统调用mmap ()向OS申请一大块内存,例如4 MB·先将内存划分成大块,例如8 KB,称作mspan

·再将大块继续划分成特定大小的小块,用于对象分配 noscan mspan:分配不包含指针的对象——GC不需要扫描scan mspan:分配包含指针的对象——GC需要扫描

·对象分配:根据对象的大小,选择最合适的块返回

三、课后个人总结:

1.自动分配内存的总结

1.1自动内存管理的背景和意义: 提高代码的性能

1.2概念和评价方法

1.3追踪垃圾回收