https://www.bilibili.com/video/BV1Mv411p7LJ/?spm_id_from=333.788.recommend_more_video.0

    1、在项目中遇到比较有意思的bug或者给你印象最深的bug!!!
    字节对齐问题
    我们在项目中有很多Struct结构体的时候,然后它结构体里面字段的排列方式如果不刻意的安排一下的话,因为有些比如说string占用的字节长度和int占用的字节长度是不一样的。会导致有一个内存不对齐,内存浪费的问题。
    等我们发现这个问题的时候,想手动去调整,但是因为结构体有很多,手动调整就很麻烦,所以目前就是把这个问题先放下来。

    但是这个问题在以前学习计算机组成原理的时候,倒是有了解过计算机的字长是多少【16 位】。操作系统每次处理一个字长需要多少字节。

    怎么发现内存浪费问题是由字节对齐的问题导致的呢?
    因为我们的代码在CI(Circle CI)过程中加入了Linter(Golang CI linter),其中有一个是memory【咩莫瑞】相关的选项,以前没有打开过,后面打开他就报错,然后就发现了这个问题。

    不确定Lint出来的结果跟内存占用多有直接关系,但是你们改了它之后发现内存就下来了,对吗?

    对,因为它内存对齐有两个方面,一方面是考虑你尽量缩减使用的内存空间,那么就是尽量不让他有尾部的填白。
    另一方面就是提高并行效率,它有两种:一种是增加存储的效率,另一种就是为了提高并行的效率。
    那就是说让每一个字段尽量让它自己占有自己一行字长,然后不要跟其他的字段共用一个字长,这样的话CPU在读取一块一块的时候,会有更高效的并行效率。所以就更有意思了,但是也没有深入

    向这种你们都是自己通过benchmark验证出来的吗?
    对,有通过benchmark验证出来的,但是问题的发现倒不是通过benchmark(基准测试),而是通过观察生产环境中的一些指标,发现内存怎么多了!!!实际上发现问题之后,有通过benchmark去改变一下把struct结构体的字段排列换一换,然后发现确实会有影响。

    https://www.cnblogs.com/hujingnb/p/14013678.html

    image.png

    1-4-1-8-1
    =1+3+4+1+7+8+1
    =4+4+8+8+1
    =8+8+8+1
    =25 + (4*8-25)[补全最大值的倍数]
    =32

    image.png

    1-1-1-4-8
    =1+1+1+1+4+8
    =4+4+8
    =8+8
    =16

    检测一下最开始的结构体文件(添加参数指定检测内存对齐):
    golangci-lint run —disable-all -E maligned
    image.png

    会看到提示, 该结构体当前占有32B, 可优化至16B. 完美.

    image.png