0

我有这些方法:

public void GetImage(JObject o)
{
    var imageFile = o["file"].ToString();

    if (!File.Exists(imageFile))
    {
         SendMessage("File does not exist");
         return;
    }

    using (var image = Image.FromFile(imageFile))
    {
         var serialized = GetImageAsString(image);

         var ob = new JObject
              {
                  { COMMAND, (int) Command.GetImage },
                  { "content", serialized }
              };

          Send(ob);
          ob = null;
          serialized = null;
    }
}

private static string GetImageAsString(Image image)
{
     using (var stream = new MemoryStream())
     {
          image.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
          return Convert.ToBase64String(stream.ToArray());
     }
}

private static void Send(JObject o)
{
     var package = EncodeContent(o);
     _stream.Write(package, 0, package.Length);
     _stream.Flush();

     Cursor.Current = Cursors.WaitCursor;
}

private static byte[] EncodeContent(JObject o)
{
     return Encoding.UTF8.GetBytes(string.Concat(GetMessageSize(o), o, (char) 3));
}

执行GetImage一个 612KB 的JPEG文件后,我的应用程序的内存消耗增加了 10MB,即使几分钟后这 10MB 也没有被释放。

  • 我如何确定由 生成的对象GetImage将符合条件GC
  • 如何确保 GetImage方法执行后不会长时间分配 生成的对象?
4

1 回答 1

3

GC 会自行决定何时释放内存——基本上,当它感到有释放内存的压力时,它就会这样做。如果它没有这种压力,它就不会。

由于您的 JPEG 是一个大对象,GC 不会将它放入 Gen1 收集器中,它比其他寿命更长的代更容易清理。因此,它更不可能有收集的压力。

要检查它是否只是因为感觉不像而没有收集它,或者它是否是泄漏,请尝试执行以下一组调用,看看你的内存会发生什么。如果它没有下降,那么你可能有泄漏(尽管我猜它只是 GC 没有收集)。(免责声明 - 我不建议您将此代码留在生产代码中。让 GC 做它的事情)。

        GC.Collect();
        GC.WaitForPendingFinalizers();
        GC.Collect();
于 2013-05-19T22:56:21.510 回答