【发布时间】:2014-03-24 23:25:49
【问题描述】:
好像我有内存泄漏,因为我看到进程每分钟都在变大。
请帮忙:-)
while (true)
{
using (Bitmap bitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb))
{
using (Graphics graphics = Graphics.FromImage(bitmap))
{
try
{
graphics.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
bitmap.Save(@path + System.Environment.MachineName + ".jpg", ImageFormat.Jpeg);
}
catch (Exception) // Handle file save problems
{
if (File.Exists("path.save"))
{
File.Delete("path.save");
}
}
}
}
Thread.Sleep(15000);
}
【问题讨论】:
-
GC 确定性地运行。一旦运行,它将释放内存。你确定内存永远不会被释放吗?应用程序是否会因内存不足异常而崩溃?
-
你为什么使用 Thread.Sleep?那是不好的做法。其次,为什么它在一个while循环中一次又一次地做同样的事情?虽然 using 块将处理有问题的对象,但如前所述,GC 将在需要运行时运行,并在需要时清理对象。也可能是您在其他地方保留了引用,导致它无法清理但仍然徘徊
-
@RohitVats,感谢您的输入,看起来它变大了(从 4,000K 开始,而不是一个小时后的过程是 7,000K)。我不确定要等多久才能发布...
-
@Ahmedilyas,为什么这是不好的做法?我试过使用计时器,但过程变成了 145,000K(不知道为什么)。原始代码在循环之外有 bmp(导致它为 12,000K),在我使用 using 语句后,它变成了 4,000K,所以我认为使用它并在循环中处理可能是个好主意。主要思路是每15秒截屏一次,覆盖之前的截图文件。
-
你是如何测量内存的?
标签: c# .net wpf memory-leaks