缩小切片并不会缩小其依赖的数组,用 Go 的术语来说,减小了切片的长度但是并没有减少容量。由于底层依赖的数组没有变动,而该数组保留了一个理论上已经被丢弃了的元素的引用,以及该元素所引用的所有其他对象。即使是代码不可见的引用被保留,Go 垃圾收集器仍然会将该元素看做是还在使用中。
在截断切片之前将末尾的指针置为空。这样保留了完整的底层数组,但抛弃了对其他内存的引用,而这些其他的内存是真正内存泄漏的地方。
对于实际的底层数组可能会有大量内存消耗的切片来说,我想到可能有两种做法,一种特殊,一种通用。特殊的一种是检查代码中“大小截断为零”的情况,并专门将切片本身置为空,而不是仅仅使用标准的切片截断功能来截断。通用的做法是明确地强制使用切片拷贝而不是仅仅截断
https://mp.weixin.qq.com/s/NdsnNEpxcTQDX0LffuDzjQ
https://mp.weixin.qq.com/s/sKlWw6XjAgCpDqUb02qplQ
https://mp.weixin.qq.com/s/p_7qZH5Ix3vVJEvbPHyMng
https://mp.weixin.qq.com/s/cO3VERANE-VWhTD4SSclBg
https://gocn.vip/topics/11089
https://github.com/coyim/coyim
https://segmentfault.com/a/1190000037435267
https://eddycjy.com/posts/microservice/linkage/
https://github.com/alibaba/sentinel-golang
https://centrifugal.github.io/centrifugo/blog/scaling_websocket/
https://github.com/gorilla/websocket
https://mp.weixin.qq.com/s/8vASJavOQrXw5bGEEMwd9Q
https://mp.weixin.qq.com/s/LmQyYLfH0f0-Q-Tlf-ik8A