2013-05-09 73 views
0

我有一个工作角色,它运行多个线程(我使用的是ThreadedWorkerRole)。我的工作人员角色下载一些数据,然后下载与数据相关的图像。本地一切正常,但当我在Azure上部署应用程序时,它首先显示合理的内存使用情况(48 MB),然后在1或2小时内拍摄到800 MB。我的应用程序确实在处理含有大量“使用”语句的对象并正确关闭流。但我仍然想知道是什么导致记忆跳到如此高的价值。还有一件事,我使用了下载数据和图像的RETSLib(PInvoke库打击RETS服务器)。它可能是非托管代码的问题吗?工作角色以合理的内存使用情况开始,但内存使用量不断增加

回答

1

它肯定是非托管代码泄漏内存的问题。 RETSLib是librets上的一个.NET包装器吗?一些对librets leaking memory的php实现的引用。

您提到“下载一些数据,然后下载与该数据相关的图像”。你是使用实体框架来获得这个初始数据还是将它存储到SQL中?如果是这样,我假设你处理ObjectContext。 EF 4.0似乎有一些内存问题。
A link (old)谈到这一点。

可以添加此作为评论,但stackoverflow不会允许我这样做,因为我的低代表点

+0

Thanx的快速回复。是的,我正在使用librets(.net包装),我根本不使用EF。还有一件事,当worker角色在运行时,我绝对无法卸载非托管库。我该如何处理这种泄漏? – ZafarYousafi 2013-05-09 13:14:48

+0

卸载dll不会解决内存泄漏,因为加载操作会将dll加载到应用程序的进程空间中。你可以尝试把DLL加载和卸载到一个单独的进程,并杀死该进程(?) – eightyeight 2013-05-10 09:35:16