2009-11-26 105 views
1

進入開發工具(模擬器工具)不斷拋出OutofMemoryException的問題,我知道它不是我的應用程序,因爲無論運行什麼項目,都會發生。清除CLR內存

我到目前爲止唯一的解決方法是重新啓動我的電腦,是否有辦法刷新/清除CLR運行時,所以我不必每次都重新啓動我的電腦?

+0

林在我束手無策這裏...我必須弄清楚到底是怎麼發生的事情,我無法承受不斷重新啓動我的電腦 – Mark 2009-11-26 02:50:06

+0

我可以以某種方式增加我的CLR內存? – Mark 2009-11-26 03:25:28

回答

0

OutOfMemoryException並不一定表示運行時有問題。任何時候系統耗盡內存,無論消耗什麼,都可能發生。

看看任務管理器中的進程列表,看看哪些內存消耗最多。

+0

我看到了,看着我的任務管理器,我只用了1.68GB的內存,而PC有4GB可用。所以我不認爲它的物理資源多數民衆贊成在問題 – Mark 2009-11-26 02:20:02

+0

好的。這可能是GC堆碎片化了。您可以嘗試在SOS調試擴展中使用DumpHeap命令(http://msdn.microsoft.com/zh-cn/library/bb190764%28VS.80%29.aspx)。如果您看到很大比例的「空閒」插槽,則會出現碎片。 – 2009-11-26 02:51:10

+0

如果我這樣做? – Mark 2009-11-26 03:00:05

1

每個運行託管代碼的進程都會啓動一個單獨的CLR運行時副本 - 並且當任何類型的進程終止時,它所消耗的內存將被回收到通用池中。

沒有什麼共享「沖洗」或「清除」。

有沒有可能您的模擬器工具沒有「一路崩潰」 - 該過程在故障狀態中四處徘徊?

+0

可能,但我看不到任何目前看起來可疑的進程。我真的不知道:( – Mark 2009-11-26 02:59:34

1

聽起來像這是第三方工具。所以我會向他們提交一個bug請求。

但正如其他人所說,問題將包含在操作系統進程中。使用任務管理器,您應該能夠識別違規流程並殺死它。這將回收內存並擦乾淨。您將不得不重新開始仿真。

如果這個問題阻止你完成你的模擬,那麼我會提交一個緊急的(但不是生氣的)錯誤請求。

+0

多數民衆贊成在這個事情,我沒有看到任何正在佔用那麼多內存的任務,但不要擔心我會提出一個錯誤修復!:) – Mark 2009-11-26 03:18:14

+0

OoME可能是由以外的事情引起的而不是使用很多的記憶。我曾經有過OoME,因爲我忘記處理Bitmap對象,所以我耗盡了GDI句柄的供應。 – ligos 2009-11-30 02:32:05

0

Windows上的x86/32位用戶模式進程僅具有2GB的可尋址虛擬內存空間。一個x64/64位進程具有16TB的可尋址虛擬內存。你沒有說你的進程是32位還是64位 - 但我會假設32位。一旦32位進程開始冒險進入虛擬或承諾內存的1.5+ GB區域,則您正在玩火,在應用程序崩潰之前,這只是一個時間問題。由於每個應用程序都不同,因此它會在崩潰時崩潰。

那麼讓我們來談談可尋址空間的「2GB」......您的應用程序使用的內存無法訪問所有2GB內存。還有就是額外消耗大量片的CLR需要運行的應用程序:

  1. 的.NET應用程序的8層不同的堆 - 看到我的回答.NET process memory usage = 5x CLR Heap Memory?
  2. 內核開銷運行的用戶模式進程
  3. 線程

所以,你可以擁有的內存演出系統上可用,但應用程序可以很容易崩潰,如果它是x86和接近上述限制。

我已經在StackOverflow上發佈了很多有關CLR內存的答案和信息,這些內容描述了很多工作原理。尋找我的名字並查看一些其他答案。這可能有助於清理一些事情。

HTH