线上程序GC影响较大,程序中的常驻对象大概有3000W,网上很多说优化GC的方法就是减少对象,但是这个程序在内存中存了很多string,也不知道怎么减少这些对象,有没有什么方法可以减少对持久化对象的GC扫描?
有疑问加站长微信联系(非本文作者)
![](https://static.golangjob.cn/static/img/footer.png?imageView2/2/w/280)
线上程序GC影响较大,程序中的常驻对象大概有3000W,网上很多说优化GC的方法就是减少对象,但是这个程序在内存中存了很多string,也不知道怎么减少这些对象,有没有什么方法可以减少对持久化对象的GC扫描?
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
`单行代码`
如果是map的value,可以换成int,然后指向slice
@liangmanlin 最终的数据还是string,int指向切片,切片存的也还是string,对象数量并没有减少
可以将所有string拼成一个大的[]byte,map value 保存在slice里面的起始和结束位置,这样就可以极大的减少对象数量 。 还可以继续优化,把字符串长度也拼到slice里面,map value 只要存起始位置就好了
那我业务没法写了,实际上这些string是在不同结构体中的,如果能简单放在一个byte中为何不拼接成一个string
3000W个string是什么功能,实在想不到,如果有那么多string的使用,应该交给前端处理
把这些变量扔到栈内存上
@liangmanlin DB中获取数据缓存
@Mericusta 栈要爆炸
你把内存当数据库来用了?
@lysShub 部分常用字段
应用3楼的方案,自己包装一下就OK啦,string实际上并没有什么特别的功能,你只需要给对象封装一个String()方法,功能几乎一样
cgo,用c自己管理内存。