我有一個執行簡單MDX查詢並生成輸出的網站。該輸出用於生成excel文件。我使用了ANTS分析器,並知道大量內存被非託管資源佔用。檢查下面的圖片:.NET應用程序中的非託管資源消耗了大量內存
我應該怎麼來檢測這樣的內存泄漏下一步怎麼辦。我想知道爲什麼這些對象還記憶猶新。請建議下一步該做什麼。
我有一個執行簡單MDX查詢並生成輸出的網站。該輸出用於生成excel文件。我使用了ANTS分析器,並知道大量內存被非託管資源佔用。檢查下面的圖片:.NET應用程序中的非託管資源消耗了大量內存
我應該怎麼來檢測這樣的內存泄漏下一步怎麼辦。我想知道爲什麼這些對象還記憶猶新。請建議下一步該做什麼。
我經歷了類似的問題。我沒有檢測內存泄漏的解決方案,但我會讓你知道我選擇的路徑。我沒有直接從頁面調用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
希望這有助於
謝謝你的回覆。任何想法如何/爲什麼使用存儲過程執行MDX查詢將有所幫助。我會嘗試這個選項並讓你知道結果。再一次感謝你。 – SharpCoder
我認爲這是因爲SQL本身正在處理查詢,而不是通過IIS以及其間的所有層到SSAS服務器運行它。 – InbetweenWeekends
只要確保處置一切,僅此而已,你能做到的。 –
@ShadowWizard:謝謝你的回覆。我正在明確調用dispose方法。在什麼基礎上你說什麼都不是必需的(我試圖理解你的這個過程)。問題是在文件生成後,應用程序池仍然保存着大量的內存。我不確定什麼樣的對象被保留以及爲什麼。 – SharpCoder
對象可能包含也是COM的屬性,需要在處理父對象之前進行處理,通常文檔會告訴這些事情。我知道說「不再需要此對象,將其從內存中移除」的唯一方法是關閉/處理它,這是我之前評論的基礎。在.NET中有垃圾收集,所以調用'dispose()'不會立即釋放內存,給它幾分鐘或自己調用'GC.Collect()',儘管我不確定它是否與非託管組件相關。 –