1.什么是gc?
Garbage Collection 简称为GC,是垃圾回收的意思。GC就是为了回收进程运行时不再使用的内存。但是GC会导致一个严重的问题就是会引起STW(stop-the-world)出现,也就是整个进程会阻塞,直到GC结束。应该尽可能的减少进程的GC时间,而且GO每两分钟就会执行一次GC操作
2.如何进行GC测试?
- GODEBUG gctrace =1 go run main.go
- 或者写一个系统的脚本文件运行,里面加入
export GODEBUG=gctrace=1
3.GC测试的信息都是什么意思?
垃圾回收信息
gc 1 @2.104s 0%: 0.018+1.3+0.076 ms clock, 0.054+0.35/1.0/3.0+0.23 ms cpu, 4->4->3 MB, 5 MB goal, 4 P。
下面根据上面的回收信息进行解读:
1 表示第一次执行
信息 | 解释 |
---|---|
1 | 表示第一次执行 |
@2.104s | 表示程序执行的总时间 |
0% | 垃圾回收时间占用的百分比,估计是和上一次的gc效率做对比 |
0.018+1.3+0.076 ms clock | 垃圾回收的时间,分别为STW清扫的时间, 并发标记和扫描的时间,STW标记的时间 |
0.054+0.35/1.0/3.0+0.23 ms cpu | 垃圾回收占用cpu时间 |
4->4->3 MB | 堆的大小,gc后堆的大小,存活堆的大小 |
5 MB goal | 整体堆的大小 |
4 P | 使用的处理器数量 |
系统内存回收信息
scvg0: inuse: 426, idle: 0, sys: 427, released: 0, consumed: 427 (MB)
|信息|解释|
|426|使用多少内存|
|0|剩下要清除的内存|
|427|系统映射的内存|
|0|释放的系统内存|
|427|申请的系统内存|
|(MB)|以MB为单位|
GC优化思路?
减少headObject,减少对象的创建。这个可以使用pprof的测试软件来测试headObject的产生数量。常用的思路有:
- 减少使用以string为key的map
- 减少对象
- 用memprof、cpuprof、GCTRACE来观察程序。
- 避免频繁创建对象(&abc{}、new(abc{})、make()),频繁调用的地方用对象池重
了解优化GC的文章:
https://www.zhihu.com/question/21615032
网友评论