![111.png](https://static.golangjob.cn/230615/8910525c3b6c6bc7e71f7711fa712448.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系统日志如下:
```text
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是在多协程里面运行的,但是这个是局部变量,为什么会有此类问题呢?请高人指点,如何解决
getBody就是一个http.Client的get请求。主要是好奇为什么pprof提示内存占用不是在getBody那一行,而是在body := string(b) 这一行。是不是真的这一行内存占用过多
#6
更多评论
用下面方案转换字符串吧,没有内存分配
```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))
}
```
#3