可能是内存泄漏还是?

时间:2012-08-23 15:45:37

标签: c# asp.net .net memory-leaks

在此感谢任何帮助。

有关方案的简要说明 -

在服务器上运行COM +(用C#编写)。此COM的任务是获取文件名,多页tiff文件的页码以及将其转换为gif文件图像的分辨率。使用代理从Web应用程序调用此COM。网站获取转换后的图像并以请求的分辨率显示。对于打印 - 它提出2个请求 - 第一个用于显示分辨率,第二个用于全分辨率(使用window.print()打印)。

问题 -

有些时候服务器内存不足并且网站上没有显示图像。服务器需要定期重启。

错误

EventType clr20r3, P1 imageCOM.exe, P2 1.0.0.0, P3 4fd65854, P4 prod.web.imaging, P5 1.0.0.0, P6 4fd65853, P7 1a, P8 21, P9 system.outofmemoryexception, P10 NIL.

Here is the error(s) on the web server (these continuously appear every minute) ….

System.Net.WebException: Unable to connect to the remote server ---> System.Net.Sockets.SocketException: No connection could be made because the target machine actively refused it
   at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
   at System.Net.Sockets.Socket.InternalConnect(EndPoint remoteEP)
   at System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Int32 timeout, Exception& exception)
   --- End of inner exception stack trace ---

我无法访问生产服务器,但sysadmin发送的错误说明OutOfMemory。

因此,假设内存泄漏并关注它 - 到目前为止我的发现对处理这种情况的经验有限 -

  • Perfmon - 我看到Process / Private Bytes正在增加,同样如此 .Net CLR内存/ Heap中的字节数。因此,我认为它是管理的 内存泄漏。我不确定。
  • CPU使用率 - 以8%开始,仅在开始时上升至80%。 它减少了3% - 12%,除了几个 它回到75%-85%的时候。不确定发生了什么 这里。
  • 我开始调试服务器COM以查看堆,gcroot等。

    1. 每次请求时,堆中有2个计数对象正在增加。 1个对象是保存图像数据。第二个对象是在一段时间后过期时从缓存中删除对象1(图像)的事件处理程序。
    2. 查看方法调用 - 两个对象都导致相同的方法。
    3. 明智的代码实现 - 请求的图像被缓存(达到一定数量) - 我可以理解它是为了获得更好的性能。可能,这就是为什么对象中的对象的引用正在增加,如第1章中所述。

我知道我给出了非常模糊的描述,但我需要某种方式来检测服务器上的真实问题。

编辑: 图像对象已经像

那样处理了
Bitmap retVal;

      using (MemoryStream buffer = new MemoryStream(doc.FileData, 0, doc.DocumentSize, false, false))
      {
        using (Bitmap original = new Bitmap(buffer))
        {
        //select the page to convert and
        //perform scaling - full resolution or the requested resolution.  
        }
      }

      using (MemoryStream buffer = new MemoryStream())
      {
        retVal.Save(buffer, ImageFormat.Gif);
        retVal.Dispose();
        return buffer.GetBuffer();
      }

2 个答案:

答案 0 :(得分:1)

确保在完成使用后放置Image个对象(例如Bitmap)。我猜你正在打开tiff图像作为位图并重新缩放它然后再将其保存为gif。如果你不处理Bitmap,它将泄漏内存(每次通常几MB,具体取决于图像的大小)。

答案 1 :(得分:0)

我认为你的第一点可能是问题的原因。您可以尝试减少缓存到期时间并检查再次出现内存错误需要多长时间,您可能必须在算法中进行更改以避免出现这种情况。你的第二个不应该是错误的原因。