只要你的channel没有引用关系了,就算你没有close关闭或者chan有大量的堆积数据没有消费,最终会被gc释放。 通过runtime的memstats可以看到memory heap stats各个数据的状态。
在tcmalloc内存管理的体系之中,一共有三个层次:ThreadCache、CentralCache、PageHeap 分配内存和释放内存的时候都是按从前到后的顺序,在各个层次中去进行尝试。基本思想是:前面的层次分配内存失败,则从下一层分配一批补充上来;前面的层次释放了过多的内存,则回收一批到下一层次。 这几个层次从前到后,主要有这么几方面的变化:
top、ps等命令。这些监控内存使用情况的方法,一般需要编写脚本,执行脚本后将执行结果发送给对应的监控服务,从而达到监控的效果。但是golang自带的包却有一个runtime包,可以轻松获取服务运行时候的各种包括内存使用情况的信息。 使用linux命令,一般情况下只能看服务使用了多少内存。但是服务内存具体的使用情况缺无法获取。golang的runtime包可以做到获取服务总共使用主机多少内存,也可以获取服务已经申请了多少内存,以及内存的分布 runtime中和内存使用情况相关的结构体为runtime.MemStats,这个结构定义了golang运行过程中所有内存相关的信息,在源代码中定义如下:
https://segmentfault.com/a/1190000010753702?_ea=2426880 https://making.pusher.com/golangs-real-time-gc-in-theory-and-practice/ Go语言能够支持实时的,高并发的消息系统,在高达百万级别的消息系统中能够将延迟降低到100ms以下,这一切很大一部分需要归功于Go的高效的垃圾回收系统。