2013-04-03 55 views
4

我有一个执行简单MDX查询并生成输出的网站。该输出用于生成excel文件。我使用了ANTS分析器,并知道大量内存被非托管资源占用。检查下面的图片:.NET应用程序中的非托管资源消耗了大量内存

Full size image

我应该怎么来检测这样的内存泄漏下一步怎么办。我想知道为什么这些对象还记忆犹新。请建议下一步该做什么。

enter image description here Full size image

+4

只要确保处置一切,仅此而已,你能做到的。 –

+0

@ShadowWizard:谢谢你的回复。我正在明确调用dispose方法。在什么基础上你说什么都不是必需的(我试图理解你的这个过程)。问题是在文件生成后,应用程序池仍然保存着大量的内存。我不确定什么样的对象被保留以及为什么。 – SharpCoder

+0

对象可能包含也是COM的属性,需要在处理父对象之前进行处理,通常文档会告诉这些事情。我知道说“不再需要此对象,将其从内存中移除”的唯一方法是关闭/处理它,这是我之前评论的基础。在.NET中有垃圾收集,所以调用'dispose()'不会立即释放内存,给它几分钟或自己调用'GC.Collect()',尽管我不确定它是否与非托管组件相关。 –

回答

0

我经历了类似的问题。我没有检测内存泄漏的解决方案,但我会让你知道我选择的路径。我没有直接从页面调用MDX,而是将MDX查询移动到一个SQL存储过程,该过程返回一个结果集,我可以像使用关系查询一样使用它。

CREATE procedure [dbo].[executeMdxQuery] 
as 
Declare @sql nvarchar(max) = ' SELECT a.* FROM OpenQuery("MY_SERVER",'' 

with member [Measures].[Fiscal Calendar Level] as ' --- remaining MDX 

exec sp_executesql @sql 
GO 

希望这有助于

+0

谢谢你的回复。任何想法如何/为什么使用存储过程执行MDX查询将有所帮助。我会尝试这个选项并让你知道结果。再一次感谢你。 – SharpCoder

+0

我认为这是因为SQL本身正在处理查询,而不是通过IIS以及其间的所有层到SSAS服务器运行它。 – InbetweenWeekends