C# 在C语言中优化内存的最佳实践#
在C#中优化内存的最佳实践是什么 我使用以下技术来优化我的记忆C# 在C语言中优化内存的最佳实践#,c#,memory-leaks,C#,Memory Leaks,在C#中优化内存的最佳实践是什么 我使用以下技术来优化我的记忆 使用后处置对象或使其为空 使用try/finally或使用block 如果需要,请使用GC.Collect() 删除不必要的对象初始化 管理图像缓存 管理BLOB数据、内存流和文件流 即使存在内存泄漏 我的应用程序正在使用以下内容: 正在处理配置文件 使用其他XML文件 使用图像功能放大、缩小、显示不同类型的图像、更改图像颜色、以xml格式保存数据 在SQL server中保存数据 您可以使用红门蚂蚁内存档案器(非免费) 或CLR探
您可以使用红门蚂蚁内存档案器(非免费) 或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
不会立即释放任何资源
GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect();
优化C#中内存的最佳实践
IDisposable
接口,释放所有资源(如果有),从所有事件中取消注册等dispose
static
变量或实例,如果需要,也要仔细考虑这些对象在程序的整个生命周期中是否需要GC.Collect()
其中许多并没有真正优化内存
Dispose()
如果对象可IDisposable
则处理该对象。这可以节省内存问题,但不一定。(如有可能,也可使用使用)
try/finally
-这类似于对不可识别的对象使用(我发现它们很乱,所以我更喜欢解决方案。)
GC.Collect()
。通常情况下,GC
在知道何时收集东西方面比你做得更好李>
我不知道你在说什么。除了使用块的
,你为什么认为你必须这样做?C#通常不会出现内存泄漏。很少有情况下,您应该手动调用GC.Collect
。没有一种方法可以“优化”内存,我认为您需要描述您的问题,以便首先诊断。什么
ClassA abc=xyz;
GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect();