/images/avatar.jpg

Kiosk Studio (2022)

Golang 内存逃逸分析

最近总是碰到有人讨论内存逃逸的问题,而且上升到装逼必备的地步,是时候了解一下什么叫内存逃逸了,于是在网上查了一下相关的资料。

Golang GMP模型

介绍 GMP 的文章有很多了,大家应该也粗浅的知道什么G(goroutine)M(Machine)P(Processsor)。相较于 Java 这样的编程语言,我们经常听到一个线程池的概念。线程池就是提前创建若干个线程,如果有任务需要处理,线程池里的线程就会处理任务,处理完之后线程并不会被销毁,而是等待下一个任务。由于创建和销毁线程都是消耗系统资源的,所以当你想要频繁的创建和销毁线程的时候就可以考虑使用线程池来提升系统的性能。

Golang GC

所有的编程语言都有内存的管理办法,这里面分两大类;一类是编程语言提供了手动管理内存的方式,开发者必须自行对内存进行申请和释放,虽然手动管理相对精准,但是编程麻烦且稍有不慎会造成内存泄露和指针乱踩的后果。另一类是由编程语言提供了垃圾收集机制,开发者不需要手动管理内存,这为开发者提供了很大的便利。

但是,垃圾回收的工作机制并不是完美的。

HTTP2 下的 Transfer-Encoding: chunked

HTTP 中传输数据有一个 chunked 的方式, 又称“分块传输”。在响应报文里用头字段Transfer-Encoding: chunked 来表示。意思是报文里的 body 部分不是一次性发过来的,而是分成了许多的块(chunk)逐个发送。而 HTTP2.0 协议作为 HTTP协议的升级,自然是对chunked模式做支持?不然!

HTTP2 是没有 chunked 的!