C# 在C语言中优化内存的最佳实践#

C# 在C语言中优化内存的最佳实践#,c#,memory-leaks,C#,Memory Leaks,在C#中优化内存的最佳实践是什么 我使用以下技术来优化我的记忆 使用后处置对象或使其为空 使用try/finally或使用block 如果需要,请使用GC.Collect() 删除不必要的对象初始化 管理图像缓存 管理BLOB数据、内存流和文件流 即使存在内存泄漏 我的应用程序正在使用以下内容: 正在处理配置文件 使用其他XML文件 使用图像功能放大、缩小、显示不同类型的图像、更改图像颜色、以xml格式保存数据 在SQL server中保存数据 您可以使用红门蚂蚁内存档案器(非免费) 或CLR探

在C#中优化内存的最佳实践是什么

我使用以下技术来优化我的记忆

  • 使用后处置对象或使其为空
  • 使用try/finally或使用block
  • 如果需要,请使用GC.Collect()
  • 删除不必要的对象初始化
  • 管理图像缓存
  • 管理BLOB数据、内存流和文件流
  • 即使存在内存泄漏

    我的应用程序正在使用以下内容:

  • 正在处理配置文件
  • 使用其他XML文件
  • 使用图像功能放大、缩小、显示不同类型的图像、更改图像颜色、以xml格式保存数据
  • 在SQL server中保存数据

  • 您可以使用红门蚂蚁内存档案器(非免费)

    CLR探查器(免费):

    不建议使用GC.Collect(),即使在某些情况下需要它。请查看以下代码:

    private void WriteStringOnImage()
    {
        try
        {
            byte[] imgData = getData(@"E:\0000.tif");
            using (System.Drawing.Image img = System.Drawing.Image.FromStream(new MemoryStream(imgData)))
            {
                for (int i = 1; i <= 1000; i++)
                {
                    Bitmap img1 = new Bitmap(new Bitmap(img));
                    RectangleF rectf = new RectangleF(800, 550, 200, 200);
                    Graphics g = Graphics.FromImage(img1);
                    g.DrawString(i.ToString("0000"), new Font("Thaoma", 30), Brushes.Black, rectf);
                    img1.Save(@"E:\Img\" + i.ToString("0000") + ".tif");
                    g.Flush();
                    g.Dispose();
                    img1.Dispose();
                    GC.Collect();
                }
            }
        }
        catch (Exception){}
    }
    
    使用:

    如果只在一个方法中使用方法级变量,请尝试使用方法级变量而不是类级变量

    确保正在清除集合对象

    密切关注应用程序中使用的任何第三方工具的内存使用情况。有时第三方工具占用很高的内存

    仅在必须时才使用
    静态

    使用
    StringBuilder
    而不是
    String
    ,因为如果串接了字符串,则会分配一个新内存,因此旧内存数据不会被使用,而是保存在RAM中

    如果有任何大型对象正在分层类中处理,请密切关注它

    如果处理了任何XML文档并将其保存在内存中以备将来使用,并且该文档将在任何事件后使用,则释放该内存并在触发所需事件时加载XML。

    避免克隆。

    如果使用字符串操作,可以检查无限循环的数据。有时,像省略号(…)这样的特殊Unicode字符会产生问题并导致无限循环

    您还可以使用Jetbrain提供的dotTrace内存分析器

    您还可以查看事件日志,查找导致问题的任何异常

    如果正在创建任何位图对象,并且正在进行一些图像处理,那么请查看非托管资源。位图对象占用大量内存用于非托管资源,可能无法释放

    正如您所提到的,您也在使用SQL server,然后还要密切关注SQL server过程和函数及其调用策略


    在SQL Server中,如果要将任何数据保存为图像数据类型,并且该数据大于1mb,则请使用带filestream的varbinary(MAX)属性,但该属性可用于SQL Server 2008或更高版本的SQL Server。

    。或者将其设为null
    Dispose()
    没有相同的效果! 小心。您只应处置您的对象。不需要设置为
    null
    设置为
    null
    不会立即释放任何资源

  • 如果需要,请使用GC.Collect()
  • 通常这不是必需的,因为GC有自己的生命周期来收集数据。由于.NET 4.5,如果您认为存在碎片,可以压缩LOH:

    GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
    GC.Collect();    
    

    优化C#中内存的最佳实践

  • 仅在需要时创建对象
  • 确定每个变量和对象的范围,如果它们是方法中所必需的,请在这些方法中声明它们,不要使它们成为私有的
  • 在自定义对象上使用
    IDisposable
    接口,释放所有资源(如果有),从所有事件中取消注册等
  • 当自定义对象不再需要某个对象时,调用
    dispose
  • 使用最少的
    static
    变量或实例,如果需要,也要仔细考虑这些对象在程序的整个生命周期中是否需要
  • 不要手动使用
    GC.Collect()

  • 其中许多并没有真正优化内存

  • 使用后处理对象或将其设为空。始终
    Dispose()
    如果对象可
    IDisposable
    则处理该对象。这可以节省内存问题,但不一定。(如有可能,也可使用
    使用
  • 使用try/finally或using block。
    try/finally
    -这类似于
    对不可
    识别的对象使用
    (我发现它们很乱,所以我更喜欢解决方案。)
  • 如果需要,使用GC.Collect()。我真的无法推荐
    GC.Collect()
    。通常情况下,
    GC
    在知道何时收集东西方面比你做得更好
  • 删除不必要的对象初始化。这一项肯定会有所帮助。如果您的代码正在创建不需要的对象。。。这样可能会浪费一些空间。这可能是一种逃避/掩盖
  • 管理图像缓存。这很模糊。。。但是是的。。。管理存储在内存中的图像数量非常重要。在内存中保存图像可能并不总是可取的。。。它可以为代码中更关键的其他进程的分页打开大门
  • 管理BLOB数据、内存流和文件流我认为这类似于#5

  • 我不知道你在说什么。除了使用
    块的
    ,你为什么认为你必须这样做?C#通常不会出现内存泄漏。很少有情况下,您应该手动调用
    GC.Collect
    。没有一种方法可以“优化”内存,我认为您需要描述您的问题,以便首先诊断。什么
    ClassA abc=xyz;
    
    GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
    GC.Collect();