2010-09-03 24 views
1

我的應用程序運行時遇到內存泄漏問題。 應用程序使用這樣的CPU內存。如何解決.Net中的內存泄漏問題(Windows應用程序)

最小百分比爲6% 最大百分比是35% 最大峯值存儲器是90MB

我已經使用ANTS內存分析器用於在應用程序判斷內存泄漏。 但我不知道如何在運行時減少應用程序的內存使用量。

請任何人能儘快給我解決。

感謝和問候 拉梅什ň

+1

代碼示例請,需要更多的信息來幫助你。只是對於初學者來說,也許看看你可能擁有的任何遞歸和值/不可變類型,看看你是否正在做任何可能以指數形式產生它們的東西。 – 2010-09-03 14:56:25

+1

90MB對於內存泄漏沒有多大意義。如果在幾個小時後是900 MB,那麼可能有問題。 – 2010-09-03 14:56:29

+0

90MB?這不壞... – SLaks 2010-09-03 14:56:44

回答

3

你怎麼知道你有內存泄漏?請記住,如果系統上沒有內存壓力,GC可能無法運行,因此可能看起來內存正在被分配,而不是釋放 - GC將在必要時處理它。

0

爲什麼你認爲你的應用程序正在泄漏?如果它一直保持90MB的使用率,那麼這不是泄漏 - 它只是展示了比你想象的更多的內存使用。如果它是一個真正的內存泄漏,那麼隨着時間的推移,它會通過使用而變得更高。如果你不能得到它的100MB那不是真的泄漏...

.NET應用程序通常表現出較高的內存使用情況(特別是在任務管理器中的某些觀點),超出你的想象。這是實際上是對你來說是一個問題,還是你認爲它是一個問題,因爲它比你想象的要高?

0

你體驗到內存使用什麼問題?否則,它似乎不存在任何問題。

除非存在任何實際的內存韭蔥(但是我認爲沒有,因爲你有配置文件的代碼),使用幾兆字節或內存,甚至不斷增長到某個點的應用程序是沒有問題的。

這是一個常見的誤解,即計算機應儘可能多地擁有可用內存,但沒有性能優勢。使用未使用的內存不會使應用程序以任何方式運行得更快。

這是正常的,因爲它運行的.NET應用程序分配更多的內存。只要有空閒的內存,這比運行垃圾收集來釋放內存的效率要高得多。應用程序將在需要時清理內存。

該系統可將信號發送到應用程序,使其釋放出儘可能多的內存可能。如果你最小化一個應用程序,這個信號被髮送給它,所以你可以用它來找出你的應用程序使用的內存大概多於絕對最小值。

0

首先,放入一些TEMPORARY定期調用GC.GetTotalMemory(true)的代碼並記錄下來。

運行該應用程序一段時間。

然後取出該臨時代碼。由於此方法確實會傷害內存使用,但它會爲您提供一些有用的細節。請記住,這純粹是一個調查步驟,不適用於99%的產品代碼。

現在,看看它正在返回的數字是否穩步攀升。如果他們沒有(並且包括攀爬一點,然後再次下降),你沒有問題。解決方案結束。

如果這樣做,那麼您需要查看直接或間接使用非託管資源,它們是非託管內存或使用它。這些將分裂成太多情況。

第一個是你自己正在使用非託管資源的地方。確保你將它們包裝在一些基於安全句柄的包裝中,並且每次使用時都會處理它們,並附帶一個終結器。不要混合直接使用同一類中的託管和非託管資源(然後避免使用Dispose(bool)模式,因爲它實際上是混合這些模式的反模式的一部分)。

第二個是你在哪裏使用的東西,反過來使用非託管資源。如果它實現了IDisposable,那麼類可能是。確保這些東西都經常丟棄。

確保你沒有不必要地實習字符串。實習字符串是一種有用的節省內存的技巧,但只有在知道字符串值在項目的整個生命週期中都會被正常使用的時候(或者至少你會添加一些不會再被使用的字符串那一生)。如果你實習的字符串不經常使用,你已經選擇了使用託管代碼將內存推向緊張的最佳方式之一(GC現在可以在實習生池中發生,但通常不會)。

也有減少內存使用而不是避免泄漏的技術,但由於您只使用了非常少量的內存(90MB),因此這裏不值得考慮。

順便提一句,你有什麼尺寸的頁面文件? 90MB爲35%意味着256MB的總內存。除非你有64MB的物理內存,這有點低。目前的建議是將頁面文件放在物理內存的100%或更少,但這是基於現在趨向於更大的內存大小。如果你擁有128MB的內存,那麼我至少會將這個頁面文件加倍,從而給出大約390MB的總內存。