gpt4 book ai didi

c# - 可能是内存泄漏或者?

转载 作者:太空狗 更新时间:2023-10-29 23:47:15 24 4
gpt4 key购买 nike

在此感谢任何帮助。

关于场景的简要描述-

服务器上运行着一个 COM+(用 C# 编写)。此 COM 的任务是获取文件名、多页 tiff 文件的页码和将其转换为 gif 文件图像的分辨率。此 COM 使用代理从 Web 应用程序调用。网站获取转换后的图像并以请求的分辨率显示。对于打印 - 它发出 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 ---

我无权访问生产服务器,但系统管理员发送的错误指出内存不足。

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

  • Perfmon - 我看到 Process/Private Bytes 正在增加,所以也是.Net CLR 内存/堆中的字节数。因此,我认为它是托管的内存泄漏。不过我不确定。
  • 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();
}

最佳答案

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

关于c# - 可能是内存泄漏或者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12095461/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com