Memory leaks 通道和内存泄漏
我正在努力开发一个连续运行的程序 它应该每隔Memory leaks 通道和内存泄漏,memory-leaks,go,channel,Memory Leaks,Go,Channel,我正在努力开发一个连续运行的程序 它应该每隔sleepPool秒从数据库中提取一些数据,并以非阻塞方式“处理”信息(至少我正试图这么做) 问题是记忆一直在增长,所以我想知道我是否做错了什么 下面是我的程序的一个片段 var uCh = make(chan *user, buffLimit) //emits new users to process var statsCh = make(chan *user, buffLimit) //emits new users to store f
sleepPool
秒从数据库中提取一些数据,并以非阻塞方式“处理”信息(至少我正试图这么做)
问题是记忆一直在增长,所以我想知道我是否做错了什么
下面是我的程序的一个片段
var uCh = make(chan *user, buffLimit) //emits new users to process
var statsCh = make(chan *user, buffLimit) //emits new users to store
func main() {
go emitUser(db)
go consumeUser(db)
for ur := range statsCh {
log.Infoln(ur)
}
}
func emitUser(db *sql.DB) {
for {
time.Sleep(sleepPool * time.Second)
log.Infoln("looking for new users")
rows, err := rowsD.Query()
for rows.Next() {
uCh <- usr
}
}
}
func consumeUser(db *sql.DB) {
for usr := range uCh {
go func(usr *user) {
//do something with the user
statsCh <- usr
}(usr)
}
}
var uCh=make(chan*user,buffLimit)//发送新用户进行处理
var statsCh=make(chan*user,buffLimit)//发送新用户到存储
func main(){
go emitUser(数据库)
转到用户(db)
对于ur:=范围statsCh{
log.Infoln(ur)
}
}
func emitUser(db*sql.db){
为了{
时间。睡眠(睡眠池*时间。秒)
log.Infoln(“寻找新用户”)
行,错误:=rowsD.Query()
对于行。下一个(){
uCh这段代码做了很多无害的传递,但不应该泄露任何东西
我猜想rowsD.Query
方法有某种缓存或其他泄漏
当然,它可能只是碎片,或者是垃圾收集器的伪制品(在这种情况下,随着时间的推移,您应该会看到内存使用量逐渐减少,甚至下降)。此代码做了很多无害的传递,但不应该泄漏任何内容
我猜想rowsD.Query
方法有某种缓存或其他泄漏
当然,它可能只是碎片,或者是垃圾收集器的伪制品(在这种情况下,随着时间的推移,您应该会看到内存使用量逐渐减少,甚至下降)。此代码做了很多无害的传递,但不应该泄漏任何内容
我猜想rowsD.Query
方法有某种缓存或其他泄漏
当然,它可能只是碎片,或者是垃圾收集器的伪制品(在这种情况下,随着时间的推移,您应该会看到内存使用量逐渐减少,甚至下降)。此代码做了很多无害的传递,但不应该泄漏任何内容
我猜想rowsD.Query
方法有某种缓存或其他泄漏
当然,它可能只是碎片,或者是垃圾收集器的伪品(在这种情况下,随着时间的推移,您应该会看到内存使用水平下降,甚至下降)。如果没有给GC足够的时间启动,请等待一个小时,然后检查内存
如果你真的想(坏主意,会让你的程序变慢)强迫它释放内存,你可以使用以下方法:
import "runtime/debug"
//........
func forceFree() {
for _ = range time.Tick(30 * time.Second) {
debug.FreeOSMemory()
}
}
func init() {
go forceFree()
}
您没有给GC足够的时间启动,请等待一个小时,然后检查内存
如果你真的想(坏主意,会让你的程序变慢)强迫它释放内存,你可以使用以下方法:
import "runtime/debug"
//........
func forceFree() {
for _ = range time.Tick(30 * time.Second) {
debug.FreeOSMemory()
}
}
func init() {
go forceFree()
}
您没有给GC足够的时间启动,请等待一个小时,然后检查内存
如果你真的想(坏主意,会让你的程序变慢)强迫它释放内存,你可以使用以下方法:
import "runtime/debug"
//........
func forceFree() {
for _ = range time.Tick(30 * time.Second) {
debug.FreeOSMemory()
}
}
func init() {
go forceFree()
}
您没有给GC足够的时间启动,请等待一个小时,然后检查内存
如果你真的想(坏主意,会让你的程序变慢)强迫它释放内存,你可以使用以下方法:
import "runtime/debug"
//........
func forceFree() {
for _ = range time.Tick(30 * time.Second) {
debug.FreeOSMemory()
}
}
func init() {
go forceFree()
}
强制gc有多大?runtime.gc()
我在emitUser
@ams中没有看到usr
的定义,这会改变什么?它是一个具有不同字段(即整数、字符串)的结构我通过了around@OneOfOnebuff限制通常是10
。buff限制有多大有助于强制gc?runtime.gc()
我在emitUser
@ams中没有看到usr
的定义,这会改变什么?它是一个具有不同字段(即整数、字符串)的结构我通过了around@OneOfOnebuff限制通常是10
。buff限制有多大有助于强制gc?runtime.gc()
我在emitUser
@ams中没有看到usr
的定义,这会改变什么?它是一个具有不同字段(即整数、字符串)的结构我通过了around@OneOfOnebuff限制通常是10
。buff限制有多大有助于强制gc?runtime.gc()
我在emitUser
@ams中没有看到usr
的定义,这会改变什么?它是一个具有不同字段(即整数、字符串)的结构我通过了around@OneOfOnebuff限制通常为10
。