您可以使用 Redgate ANTS 内存分析器(非免费)。
或 CLR 分析器(免费):https://msdn.microsoft.com/library/ms979205
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){}
}
在上面的示例中,我使用了GC.Collect(),因为如果我不使用GC.Collect(),那么它会占用大约1500mb 的内存。但是在使用GC.Collect() 之后,如果永远不会超过 75mb
即内存利用率减少了 20 倍。
但是如果GC.Collect() 被过度使用并且内存中没有太多未使用的对象,那么GC.Collect() 会降低你的性能并且很耗时。
如果它实现了IDisposable,你也可以使用Dispose()。
如果您正在使用MemoryStream 或任何其他类型的流,那么您应该使用using 块。
有时您还需要清空一些对象,将其设为null。
我们知道数据,如果我们处理 XML 数据,那么它会占用非常大的内存,所以我们需要在使用后释放内存,但是 XML 类没有实现 Idisposable 接口,所以你必须让它为空(例如xmldocument=null;)
您还应该记住不必要的对象初始化。
例如而不是:
ClassA abc=new ClassA();
abc=xyz;
用途:
ClassA abc=xyz;
如果仅在一种方法中使用,请尝试使用方法级别变量而不是类级别。
确保您正在清除集合对象。
密切关注您的应用程序中使用的任何第三方工具的内存使用情况。有时第三方工具会占用非常高的内存。
只有在必要时才使用static。
使用StringBuilder而不是String。因为如果将字符串连接起来,则会分配新内存,因此旧内存数据不会被使用,而是保存在RAM中。
如果在分层类中处理任何大型对象,请密切注意它。
如果任何 XML 文档已被处理并保存在内存中以供将来使用,并且将在任何事件之后使用,则释放该内存并在触发所需事件时加载 XML。
避免克隆。
如果您正在处理字符串操作,您可以检查数据是否存在无限循环。有时,省略号(...)等特殊 Unicode 字符会产生问题并导致无限循环。
您还可以使用 dotTrace Jetbrain 的内存分析器。
您还可以查看事件日志,了解导致问题的任何异常。
如果正在创建任何位图对象并且正在处理一些图像,那么请查看非托管资源。 位图对象为非托管资源占用大量内存并且可能不会被释放。
正如您所提到的,您也在使用 SQL 服务器,那么还要注意 SQL 服务器过程和函数 及其调用策略。
在 SQL Server 中,如果您将任何数据保存为图像数据类型并且大于 1mb,请使用 varbinary(MAX) 和 filestream 属性,但它适用于 SQL Server 2008 或更高版本SQL Server 的版本。