簡體   English   中英

C#程序中的內存使用率過高

[英]Overly high memory usage in a C# program

首先,我想說的是,我知道.NET程序的實際內存使用量和所聲明的內存使用量並不相同。 這些年來,我已經使用了許多.NET程序,並認為學習編程和對我發現的一些開源項目做出貢獻會很有趣。

但是,在構建我的小型應用程序並獲得一些最低限度的功能時,似乎要付出巨大的內存成本。 它約為40kb,其中包含一些圖像,但是從20mb的內存開始,並且在執行了一些操作之后上升到30s的低位。

與我同時運行的其他.NET應用程序相比,它的大小是它們的3倍以上。

我以為我是編程新手,可能會缺少一些東西。 我環顧了Visual Studio,發現一個設置從調試更改為發布,並嘗試將其設置為發布,但沒有發現任何區別。

我還有其他設置嗎? 還是我由於這種巨大差異而無法正確編寫代碼? 我想在嘗試進行Windows Phone 7開發之前應該解決此問題,這是我的目標,因為那里的內存將是一個更大的問題。

更新:該程序是一個RSS閱讀器,它僅檢查Twitter提要並將數據解析為具有基於hash標簽的一些其他信息的列表框。 我希望有一個免費的或非常低成本的解決方案,因為這只是我的愛好,因此高成本的專業級輪廓分析程序對於我的意圖而言似乎太昂貴了。

我絕對同意Rob的看法,因為探查器會告訴您代碼中是否存在內存泄漏或使用效率低下的問題。 但是,您必須記住,即使您有一個小型的.NET應用程序,您(除您自己的代碼外)還將加載CLR,JIT編譯器,眾多框架程序集等。此外,如果在分析了您的應用程序之后,GC預測您將需要大量堆內存,它可能會重新調整堆大小的大小以實現快速分配等((如果內存資源壓力很大,可能會減小大小)。

因此,總而言之,似乎很大的運行中內存分配可能並不表示任何問題,但是通過分析可以使您再次檢查該問題。

使用內存分析器(http://www.google.co.uk/search?q=dot+net+memory+profiler-我自己喜歡DotTrace),您應該能夠找到造成此問題的原因。

分析是最好的方法,因為否則您可能會“修復”甚至沒有損壞的東西

一種猜測是,在輪詢RSS提要時,您會不斷創建新對象,即使您最終沒有“使用”它們中的大多數,它們仍然駐留在內存中,直到垃圾回收器來收集它們為止。 這本身不是問題,但是它可能會使您的應用程序似乎占用更多內存。

我最近遇到了類似的問題,發現使用Sysinternals的免費工具很有幫助: VMMAP

基本上,您可以了解應用程序實際使用了多少內存,以及Windows分配了哪些內存。 在大多數情況下,Windows和.NET都會分配內存,以使您的應用程序更好地運行並減少內存分配量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM