寻找Go应用程序中的内存泄漏

时间:2017-03-14 06:34:21

标签: opencv go memory-leaks

我有一个简单的程序,可以从网络摄像头中读取帧,并将指针放在goroutine的通道上。另一部分从通道读取帧指针并将它们弹出到另一个队列。然后,这个其他队列对它们进行一些额外的处理,并且当完成这个额外的处理时,分配一堆内存,显然永远不会被垃圾收集。我正在试图找出原因:

此函数以循环方式从通道中读取帧:

func (mr *OpenCVMotionRunner) Run() error {
log.Println("Starting motion detection... ")

// inMotion := false
win := opencv.NewWindow("GoOpenCV: VideoPlayer")
defer win.Destroy()

test := mr.md.(*CV2FrameDiffMotionDetector)
for {
    f := mr.imageChan.PopFrame()
    mr.frame = nil
    switch f := f.(type) {
    default:
        return fmt.Errorf("Unknown frame type")
    case *BSFrame:
        mr.frame = f.ToOpenCVFrame()
    case *OpenCVFrame:
        mr.frame = f
    }
    f = nil
    test.SetCurrent(mr.frame)
    delta := test.Delta()
    // win.ShowImage(mr.frame.image)
    if delta != nil {
        win.ShowImage(delta)
        opencv.WaitKey(1)
    } else {
        fmt.Println("wtf")
    }
}

return nil

}

有问题的部分似乎是具体的:

mr.frame = f.ToOpenCVFrame()

这是类型和方法:

// Frame with byte slice image
type BSFrame struct {
    image  []byte
    Time   time.Time
    Width  uint32
    Height uint32
}

func (f *BSFrame) ToOpenCVFrame() *OpenCVFrame {
    img := opencv.DecodeImageMem(f.image)
    return &OpenCVFrame{
        image:  img,
        Time:   f.Time,
        Width:  f.Width,
        Height: f.Height,
    }
}

这是目的地类型:

type OpenCVFrame struct {
    image  *opencv.IplImage
    Time   time.Time
    Width  uint32
    Height uint32
}

PopFrame,FYI,只是一种对通道别名的类型的方法:

type BSFrameChan chan *BSFrame

func (fc BSFrameChan) PopFrame() (frame Frame) {
    frame = <-fc
    return
}

希望这是解决问题的足够代码。如果需要,剩下的就是here

1 个答案:

答案 0 :(得分:0)

go library I'm using for the OpenCV bindings在图像上提供Release方法,以便在完成图像时释放内存。这解决了这个问题。