.NET中的内存泄漏

问题

如果您的程序在使用C#时由于内存泄漏而停止。您可以打开 Task ManagerPerformance 查看运行程序时使用了多少GPU内存。

在 .NET 中运行示例时内存泄漏

可能的原因

通常情况下内存泄漏发生的原因是因为您的IDisposable对象尚未被释放。垃圾收集器处理应用程序内存并确保在内存耗尽之前清理未引用的对象。但是垃圾收集器不知道GPU内存使用情况。因此,它可能无法在GPU内存填满之前及时清理。

下面的示例代码在循环捕获包含3个采集项的HDR图像时会发生内存泄漏。

// This code results in memory leak.

using System;
using System.Collections.Generic;

class memoryLeak
{
    static int Main()
    {
        try
        {
            var zivid = new Zivid.NET.Application();

            Console.WriteLine("Connecting to camera");
            var camera = zivid.ConnectCamera();

            Console.WriteLine("Configuring settings");
            var settings = new Zivid.NET.Settings();
            foreach(var aperture in new double[] { 9.57, 4.76, 2.59 })
            {
                Console.WriteLine("Adding acquisition with aperture = " + aperture);
                var acquisitionSettings = new Zivid.NET.Settings.Acquisition { Aperture = aperture };
                settings.Acquisitions.Add(acquisitionSettings);
            }

            while(true)
            {
                var frame = camera.Capture(settings);
                Console.WriteLine("Captured frame (HDR)");
            }
        }
        catch(Exception ex)
        {
            Console.WriteLine("Error: " + ex.Message);
            return 1;
        }
        return 0;
    }
}

发生的情况是 var frame = camera.Capture(settings) 创建了一个新对象 frame。而捕获下一帧时该对象没有释放。

解决方案

为了缓解这种情况,建议通过使 用 using 关键词来强制执行确定性内存清理。

using(var frame = camera.Capture(settings))
{
    Console.WriteLine("Captured frame (HDR)");
}

也可以在每次捕获后显式处理帧。

var frame = camera.Capture(settings);
Console.WriteLine("Captured frame (HDR)");
frame.Dispose();

您可以通过 在 task manager 中检查内存使用情况来确认您不再有内存泄漏的问题。

在 .NET 中运行示例时没有内存泄漏