GO是否支持减少对持久化对象的GC扫描

LYL_GO · 2021-12-10 15:27:44 · 1835 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2021-12-10 15:27:44 的主题,其中的信息可能已经有所发展或是发生改变。

线上程序GC影响较大,程序中的常驻对象大概有3000W,网上很多说优化GC的方法就是减少对象,但是这个程序在内存中存了很多string,也不知道怎么减少这些对象,有没有什么方法可以减少对持久化对象的GC扫描?


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1835 次点击  
加入收藏 微博
12 回复  |  直到 2022-01-06 10:10:51
liangmanlin
liangmanlin · #1 · 3年之前

如果是map的value,可以换成int,然后指向slice

LYL_GO
LYL_GO · #2 · 3年之前

@liangmanlin 最终的数据还是string,int指向切片,切片存的也还是string,对象数量并没有减少

jinl80
jinl80 · #3 · 3年之前

可以将所有string拼成一个大的[]byte,map value 保存在slice里面的起始和结束位置,这样就可以极大的减少对象数量 。 还可以继续优化,把字符串长度也拼到slice里面,map value 只要存起始位置就好了

LYL_GO
LYL_GO · #4 · 3年之前
jinl80jinl80 #3 回复

可以将所有string拼成一个大的[]byte,map value 保存在slice里面的起始和结束位置,这样就可以极大的减少对象数量 。 还可以继续优化,把字符串长度也拼到slice里面,map value 只要存起始位置就好了

那我业务没法写了,实际上这些string是在不同结构体中的,如果能简单放在一个byte中为何不拼接成一个string

liangmanlin
liangmanlin · #5 · 3年之前
LYL_GOLYL_GO #2 回复

@liangmanlin 最终的数据还是string,int指向切片,切片存的也还是string,对象数量并没有减少

3000W个string是什么功能,实在想不到,如果有那么多string的使用,应该交给前端处理

Mericusta
Mericusta · #6 · 3年之前

把这些变量扔到栈内存上

LYL_GO
LYL_GO · #7 · 3年之前

@liangmanlin DB中获取数据缓存

LYL_GO
LYL_GO · #8 · 3年之前

@Mericusta 栈要爆炸

lysShub
lysShub · #9 · 3年之前

你把内存当数据库来用了?

LYL_GO
LYL_GO · #10 · 3年之前

@lysShub 部分常用字段

liangmanlin
liangmanlin · #11 · 3年之前
LYL_GOLYL_GO #7 回复

@liangmanlin DB中获取数据缓存

应用3楼的方案,自己包装一下就OK啦,string实际上并没有什么特别的功能,你只需要给对象封装一个String()方法,功能几乎一样

fmyxyz
fmyxyz · #12 · 3年之前

cgo,用c自己管理内存。

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传