gpt4 book ai didi

memory-management - delete() 是立即释放内存还是需要 runtime.GC() 来释放它?

转载 作者:IT王子 更新时间:2023-10-29 01:46:18 26 4
gpt4 key购买 nike

我有一张 map

myMap := map[string]string
myMap['hello'] = 'world'
myMap['foo'] = 'bar'

当我从 myMap 中删除一个元素时,例如,

delete(myMap['hello'])

它是立即释放内存还是在垃圾收集器运行后释放内存。
如果它在垃圾收集器运行后释放内存,是否运行 runtime.GC() 将立即清理内存。

还有 runtime.GC() 资源匮乏吗?或者可以在每个 delete() 函数之后运行 runtime.GC()

更新 2:
忘记我的程序做了什么(基本更新1)
检查此链接 http://play.golang.org/p/Wb8-4qWyf4
每 10 微秒有一个子例程要添加到 Map
有一个子程序每 1 微秒从 map 中删除一次(比添加快 10 倍)
在你的本地机器上运行这个程序,你会发现它一直在慢慢地占用越来越多的内存。 (慢慢的因为我加了休眠时间,不然电脑会挂)

更新 1
我的程序每分钟从数据库中获取 5000 行数据,并将其存储在名为 datastore 的映射中。
有 100 个子例程正在运行,它们处理数据存储中的每一行。处理一行需要很多时间(不到一秒)
如果数据处理成功,则会从数据存储中删除“delete()”,但在下一分钟内,将提取下一个 5000 并添加到数据存储中。
我在数据存储中最多保留 20,000 行。这并不多(最多 200 MB)
在处理了数百万行之后,应用程序开始占用 100% 的 RAM,最后被内核杀死。如果 delete() 立即清除内存,则不应发生这种情况。

最佳答案

您只执行了一次删除器。此外,map 访问不是并发安全的,因此您需要在代码周围添加 Mutex。

这是一个不会随时间增长的修复:http://play.golang.org/p/GWQ2hJiySP

package main

import (
"fmt"
"sync"
"time"
)

var datastore = make(map[int64]string)

var m sync.Mutex

func adder() {
var count int64 = 0
for {
m.Lock()
datastore[count] = "kjnbhjsdhgvsaghbsdbasjsabjhsabasbdjashdbashdbjasbdhasbdjbdjbdjhabjds"
m.Unlock()
count++
time.Sleep(10 * time.Microsecond)

}
}

func deleter() {
for {
m.Lock()
for key, _ := range datastore {
delete(datastore, key)
time.Sleep(1 * time.Microsecond)
}
m.Unlock()
}
}

func main() {
// Start adding stuff to datastore (with MORE sleep time = 10 Microsecond)
go adder()

// Wait for some time
time.Sleep(1 * time.Second)

// Start deleting stuff from datastore (With LESS sleep time = 1 Microsecond)
go deleter()

time.Sleep(1 * time.Hour)
fmt.Println("Done")
}

我已经在整个循环的 deleter 中加了锁。它应该只需要在delete 周围,但是,你不应该用范围删除条目,因为修改映射可以改变迭代的顺序,所以这个结构不应该被用在一个真实的程序。

关于memory-management - delete() 是立即释放内存还是需要 runtime.GC() 来释放它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22881549/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com