string类型转换也会有内存溢出问题?

liapples · 2023-06-15 08:53:14 · 1686 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2023-06-15 08:53:14 的主题,其中的信息可能已经有所发展或是发生改变。

111.png
body := string(b) 就这一行代码,通过pprof查看内存占用过多。其中b类型是[]byte,而body类型是string。

刚开始以为是getBody导致的,因为使用http.Client处理不当导致内存溢出问题,但修改了多次,pprof指示的都是body := string(b)这一行内存占用过多。

而getBody中返回值已经限制b的返回长度不超过200*1024,但运行几天后,依然会内存溢出而被系统杀掉的情况。难道是官方的string类型转换有bug?

/var/log/messages系统日志如下:

Jun 14 18:03:04 VM-8-5-centos kernel: Out of memory: Kill process 9568 (data-center) score 322 or sacrifice child
Jun 14 18:03:04 VM-8-5-centos kernel: Killed process 9568 (data-center), UID 0, total-vm:1984540kB, anon-rss:1256132kB, file-rss:0kB, shmem-rss:0kB

另外这个GetTitle是在多协程里面运行的,但是这个是局部变量,为什么会有此类问题呢?请高人指点,如何解决


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

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

1686 次点击  
加入收藏 微博
6 回复  |  直到 2023-06-16 08:30:45
jan-bar
jan-bar · #3 · 2年之前

用下面方案转换字符串吧,没有内存分配

// 1.20之前版本
func BytesToString(b []byte) string {
   return *(*string)(unsafe.Pointer(&b))
}

// 1.20版本
func BytesToString(b []byte) string {
    return unsafe.String(unsafe.SliceData(b), len(b))
}
GGXXLL
GGXXLL · #4 · 2年之前

能放下你的 getBody 方法么

tuzhiya
tuzhiya · #5 · 2年之前

你把 body := string(b) 访问限制之后看下。相当于转换你不把b置空的话,再推出函数前,函数的占用会是b的两倍。然后用太多这个函数,你觉得占用会到多少

liapples
liapples · #6 · 2年之前
GGXXLLGGXXLL #4 回复

能放下你的 getBody 方法么

getBody就是一个http.Client的get请求。主要是好奇为什么pprof提示内存占用不是在getBody那一行,而是在body := string(b) 这一行。是不是真的这一行内存占用过多

liapples
liapples · #7 · 2年之前
tuzhiyatuzhiya #5 回复

你把 body := string(b) 访问限制之后看下。相当于转换你不把b置空的话,再推出函数前,函数的占用会是b的两倍。然后用太多这个函数,你觉得占用会到多少

这个有试过b和body不再使用之后就通过 b = nil; body = "" 赋值置空,,但是这代码有跟没有一样。 不知道是不是系统gc内存清理的bug,没有及时清理引起的

liapples
liapples · #8 · 2年之前
jan-barjan-bar #3 回复

用下面方案转换字符串吧,没有内存分配 ```go // 1.20之前版本 func BytesToString(b []byte) string { return *(*string)(unsafe.Pointer(&b)) } // 1.20版本 func BytesToString(b []byte) string { return unsafe.String(unsafe.SliceData(b), len(b)) } ```

这个可以一试

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