2010-09-20 60 views
1

我創建了Windows Service上運行的WCF應用程序。它是使用Windows Installer安裝的。我遵循以下文章中提到的過程相同。WCF Windows服務每次調用後都不釋放資源/內存

http://msdn.microsoft.com/en-us/library/bb332338.aspx#msdnwcfhc_topic4

大多數WCF性能保持爲默認的net.tcp協議,每個呼叫實例等。

每次通話後服務內存消耗量不斷增加,不減少。最後它會拋出OutOfMemory消耗。

應用程序返回非常繁重的基於字符串的數據。使用內存分析器我發現內存仍然分配給字符串對象並在調用期間增加。

根據我的理解字符串是管理對象應該釋放數據一次超出範圍。

讓我知道是否需要具體的其他配置/編碼信息。

+0

與其他任何東西一樣,字符串只有在沒有任何引用時纔會被釋放。如果你看到字符串沒有被釋放,那是一個症狀,而不是問題。找出哪個對象將持有該字符串的一個實例,然後找出誰仍然堅持對該對象的引用。或者忽略分析器中的字符串,並查看*你的*類中哪些被泄漏。 – 2010-09-22 12:31:37

+0

我已經在perf mon中檢查了我的代碼中的大對象LOH msdn.microsoft.com/en-us/magazine/cc534993.aspx,發現它們存在。搜索網我找不到任何合適的方法來處理LOH行爲。 – BigBoss 2010-09-26 20:04:57

回答

0

經過多次沒有成功嘗試處理LOH(http://msdn.microsoft.com/en-us/magazine/cc534993.aspx),這是我的上下文中非常大的字符串,我創建了自定義類來處理它。

不是將大字符串存儲在單個對象中,而是將其存儲爲自定義對象中的小字符串的集合。 .NET正確處理它,而不會產生上述問題。

其他可能的解決方案與我一起工作是使用文件對象來存儲大文件並作爲文本閱讀器訪問它。這工作良好,並保持應用程序的足跡小。對我來說不幸的是,它不起作用,訪問文件位置不被允許用於應用程序。

0

必須在代碼中保留對這些字符串的引用。你可以使用你的分析器跟蹤保持字符串對象活動的引用嗎?

+0

使用內存pro-filer我發現許多對象仍然在內存中,沒有得到釋放。即使字符串對象沒有發佈,但我認爲它可能與http://msdn.microsoft.com/en-us/magazine/cc534993.aspx這個有關。我得出的結論是,如果達到一定的內存限制,我需要重新啓動服務。 – BigBoss 2010-09-22 11:30:19

+0

難道你不能發佈什麼樣的對象沒有發佈?有沒有可能丟棄的物品? – Kangkan 2010-09-22 12:06:46

+0

請檢查新添加的評論。 – BigBoss 2010-09-26 20:04:05

0

如果沒有一些代碼來回答這個問題就很難回答。您始終可以調用GC.Collect(GC.MaxGeneration)來強制垃圾收集,並查看它是否不會減少內存消耗。理想情況下,這只是臨時代碼來追蹤應用程序中發生的事情。如果強制垃圾收集不會減少內存消耗,則必須通過靜態成員變量或其他方式保留對字符串的引用:不瞭解代碼是什麼,任何理論都是暗處拍攝的

+0

我曾嘗試使用GC.Collect()和其他一些垃圾收集器方法,但最終沒有結果。很顯然,我發現它與大對象LOH http://msdn.microsoft.com/en-us/magazine/cc534993.aspx有關,它不能正確處理。 – BigBoss 2010-09-26 20:02:05

+0

請檢查新添加的評論。 – BigBoss 2010-09-26 20:07:14

相關問題