【问题标题】:Application process gets bigger even with using statements即使使用语句,应用程序也会变得更大
【发布时间】: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


【解决方案1】:

运行该进程 24 小时后,我看到内存列在几个小时后稳定了,正如你们大多数人所说,我再也不用担心这个列了 :-) 感谢您的提示,我现在知道的更多了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    • 2015-05-01
    • 2018-08-23
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    相关资源
    最近更新 更多