go内存 | 青训营笔记

59 阅读2分钟

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

今天的课大概是讲了有关性能调优和go内存管理方面的基础知识

知识点

性能优化层面的优化点,以及性能优化的基础概念的理解

大概介绍了go的gc,和一些gc工作的原理

go的内存分配的理解

介绍了一种对于内存的优化方案Balance GC(感觉类似cpp中的内存池)

有关编译器优化

举例/个人思考

举例的话( 对于程序内存和编译器优化的例子感觉更适合以cpp/rust等基础语言作为练习项目或者参考啥的,我在开发go web程序的时候感觉通常还是不会考虑这些,而是统统交给框架去做,这也是go,java 这种用于web的主流语言的一种优势,完善的gc和简单易用的框架能让编程方便很多

对于balanced gc的感觉就像在学cpp server的一些有关知识的时候,自己构建的内存池,通过提前申请成块内存来减小重复申请所带来的性能损耗,但是go中因为加入了gc的话,可能用起来会比cpp的简单方便许多

对于编译器分析的话,感觉以go为例子,不会有以g++等为例子感觉更为明显(没有尝试过go编译器的奇奇怪怪操作,暴论)

通过观察不同编译优化条件和反编译的代码之间的区别,以及汇编的一些奇怪操作,对于这些应该就会有较为明显的感觉了

纪录一些课后问题

自动内存管理技术通常分为两类:引用计数和垃圾回收。

  1. 引用计数:这种技术维护每个对象的引用计数值,当计数值为 0 时,该对象可以被回收。优点是实现简单,不会产生内存碎片,可以很快地回收对象。缺点是容易产生循环引用问题,不能解决这种情况。

  2. 垃圾回收:这种技术跟踪活动对象,回收那些不再使用的对象。优点是可以解决循环引用问题,不会产生内存碎片,可以保证内存可用性。缺点是实现相对复杂,可能会产生停顿。

分代 GC 的初衷是解决内存管理的效率问题。在分代 GC 中,系统将内存分成若干个代,每个代都有不同的回收频率。新生代的对象回收频率高,老年代的对象回收频率低。这样可以有效地减少不必要的回收,提高系统的性能