求助,GO内存没有释放,帮忙看看

我看你有戏 2017-09-24 10:46:25

package main

import (
"fmt"
"time"
)

func exec() {
go exe()
go exe()
go exe()
}
func main() {
exec()
time.Sleep(3600 * time.Second)
}

type mydata struct {
cb []byte
str string
}

func exe() {
var mq = make(chan *mydata, 1024)
for i := 0; i < 1024; i++ {
p := new(mydata)
p.cb = make([]byte, 1024*1024*5)
p.str = fmt.Sprintf("%d", i)
mq <- p
}

close(mq)

for p := range mq {
fmt.Println(p.str)
}
fmt.Println("退出exe ", len(mq))
}





执行后,内存占了500M左右,不释放,请问是啥问题
...全文
2023 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
smmssmms 2017-12-27
  • 打赏
  • 举报
回复
上面的极端例子go的GC已经满足不了了,这并不能说明go解决不了上面的问题。 go 称为系统编程语言肯定有他的道理,go可以通过syscall实现C的malloc和free,从而实现手动内存管理(GC 不会scan这部分内存)。 下面两段代码(对于内存使用场景和上面类似)一个是通过go的GC(有一个G内存没被回收),一个是通过syscall实现malloc和free(free后立马被回收)。 在非极端情况下,go的runtime足以应付并且有很好的性能,在极端情况下,只要是在系统内核之上,go都可以解决,就看个人能力了。

package main

import (
	"fmt"
	"time"
)

func main() {
	sliceLength := 1 << 10

	// 1MB
	buffLength := 1 << 20

	datas := make([][]byte, sliceLength)

	for i := 0; i < sliceLength; i++ {
		buff := make([]byte, buffLength)
		for i := 0; i < buffLength; i++ {
			buff[i] = 'G'
		}
		datas[i] = buff
	}

	fmt.Println("Cancel...")
	<-time.After(time.Hour)
}

package main

import (
	"fmt"
	"time"

	"github.com/glycerine/offheap"
)

func main() {
	sliceLength := 1 << 10

	// 1MB
	buffLength := 1 << 20

	datas := make([][]byte, sliceLength)
	freeList := make([]*offheap.MmapMalloc, sliceLength)

	// Malloc
	for i := 0; i < sliceLength; i++ {
		mmap := offheap.Malloc(int64(buffLength), "")
		buff := mmap.Mem
		for i := 0; i < buffLength; i++ {
			buff[i] = 'G'
		}
		datas[i] = buff
		freeList[i] = mmap
	}

	// free
	for _, v := range freeList {
		v.Free()
	}

	fmt.Println("Cancel...")
	<-time.After(time.Hour)
}
码无边 2017-12-14
  • 打赏
  • 举报
回复
gc回收不是立马生效,需要回收的只是被打上了标记
lhw---9999 2017-10-05
  • 打赏
  • 举报
回复
你等1个小时后再看看。
oyljerry 2017-09-28
  • 打赏
  • 举报
回复
你可以再加点别的无关代码,需要go发生gc后才会回收
霜之哀伤 2017-09-26
  • 打赏
  • 举报
回复
如果你是在Windows的任务管理器中查看内存占用的话。。 GC类的语言,垃圾回收是把内存标记为可用,一般是不会立即把内存返回给操作系统的(Java也是类似)

2,190

社区成员

发帖
与我相关
我的任务
社区描述
go语言学习与交流版
社区管理员
  • go语言社区
  • Freeman Z
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧