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