缩减Golang程序体积

缩减Golang程序体积

通常情况下,Golang编译出来的程序体积都比较偏大。主要原因是Golang是静态编译–把它所依赖的库通过静态连接方式,打入可执行文件包中。这样的做法好处是,减少平台相关性,缺点也比较明显–程序体积较大。那么有什么办法减小golang程序体积呢?

减小程序体积

方式1.
在编译命令中添加 -ldflags="-s -w"参数。例如:go build -ldflags="-s -w" -a -v -o xxx main.go
原理:-w关闭DWARF调试信息:您将无法在二进制文件上使用gdb查看特定功能或设置断点或获取堆 栈跟踪,因为将不包含gdb需要的所有元数据。 您也将无法使用依赖于该信息的其他工具,例如pprof分析。 -s关闭Go符号表的生成:您将无法使用’go tool nm’在二进制文件中列出符号。
方式2.
使用linux下常用工具: strip/objcopy 。通过strip 工具将可执行文件中的符号文件和调试信息段丢弃。(该方式与1方式效果基本一致)
方式3.
通过UPX加壳压缩。例如:upx -9 xxx 。该方式能将目标文件压缩至原大小的50%~70%(相当优秀了)
原理:其实是利用特殊的算法,对EXE、DLL或者ELF文件里的资源进行压缩。类似WINZIP 的效果,只不过这个压缩之后的文件,可以独立运行,解压过程完全隐蔽,都在内存中完成。解压原理,是加壳工具在文件头里加了一段指令,告诉CPU,怎么才能解压自己。当加壳时,其实就是给可执行的文件加上个外衣。用户执行的只是这个外壳程序。当执行这个程序的时候这个壳就会把原来的程序在内存中解开,解开后,以后的就交给真正的程序。
方式4.
综合方式1和方式3,也就是说先将符号文件和调试信息文件剥离。然后在进行压缩处理,这样能最大限度将目标文件处理到最小体积(约为原文件大小的30%~40%左右)

减小体积后的影响

减小体积后,对golang程序有什么影响呢?或者说小体积golang 程序和原程序有什么区别呢?
首先,剥离符号文件和调试信息后,对文件正常执行几乎没有影响。即使程序panic后,同recover依然能捕获崩溃详细信息(Golang程序编译成ELF文件后,会比C++生成的ELF文件多一个名为:.gopclntab的段。该段又称运行时符号文件,记录函数,变量文件符号。崩溃时,recover能输出函数调用的堆栈,就是因为有这个段。).但是由于没有了符号文件和调试信息,所有官方自带工具pprof将不能正常分析了。
最后,通过压缩方式减小体积。这个除了程序启动时稍慢一点(需要先解压),没有任何影响。这种方式是经过了大量的线上环境检验过的。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值