2013-02-25 72 views
2

這是我的代碼:這個C#程序爲什麼會在內存爲24GB的64位計算機中耗盡內存?

public class Class1 
{ 
    public int[][] binArray; 
    public Class1() 
    { 
     binArray = new int[1000][]; 
     for (int i = 0; i < 1000; i++) 
     { 
      binArray[i] = new int[61608]; 
     } 
    } 
} 
class Program 
{ 
    static void Main(string[] args) 
    { 
     Class1 c1 = new Class1(); 
     Class1 c2 = new Class1(); 
     Class1 c3 = new Class1(); 
     Class1 c4 = new Class1(); 
     Class1 c5 = new Class1(); 
     Class1 c6 = new Class1(); 
     Class1 c7 = new Class1(); // Memory will run out at about this point 
     Class1 c8 = new Class1(); 
     Class1 c9 = new Class1(); 
     Class1 c0 = new Class1(); 
     Console.WriteLine(); 
    } 
} 

Class1的用於存儲陣列,我認爲這將得到61608個* 4字節足夠的內存碎片的內存機器的24GB,爲什麼當我初始化第七課時,它仍然會拋出一個out of memory exception

+0

我也在8GB和12GB內存的64位機器上試用這個,結果也一樣。 – user2108826 2013-02-25 21:02:01

+0

您是否在構建時定位到x64? – Saggio 2013-02-25 21:04:37

+0

您是否編譯並運行AnyCPU,x86或x64? – 2013-02-25 21:04:48

回答

6

這幾乎肯定是因爲您將可執行文件構建爲32b。即使在超過〜3GB內存的情況下,即使在64b計算機上運行,​​它仍會彈出。編譯爲64b,你會沒事的。

+1

謝謝,這是問題所在,我可以現在就去吧! – user2108826 2013-02-25 21:12:33

2

這看起來像你正在執行的32位。每個類實例使用大約250mb的內存(1000 * 61608 * 4 +開銷),因此7個實例將進入大約1.7gb的內存使用。通常情況下,.NET 32位進程的內存不足,不再能夠分配較大的碎片。

如果您在VS 2012中構建,請認識到,默認情況下,AnyCPU(默認目標)仍將以x86爲目標,因爲有一個新的「首選32位」選項。關閉該選項將導致AnyCPU以64位進程的方式構建和運行。

或者,您可以明確地將x64作爲64位進程運行。

+0

謝謝,現在解決了:) – user2108826 2013-02-25 21:12:59

1

一些快速的信封計算回來;

  • 新的61608個元素的int數組。添加1數組指針(站在這個要被校正),所以乘法61609
  • 由1000 = 61609000,添加另一個1數組指針,61609001
  • 乘以4爲int相當於Int32,給出了每個246436004個字節Class1
  • 乘以7%的Class1例如葉1725052028個字節......約,所以我們正在尋找單獨的陣列

拍攝約1.6Gbs現在自身希望應用程序佔用更多的空間,我不佔很多。內存不足異常的一個可能原因是由於系統上可能發生的分頁。操作系統不保證你的程序的內存將駐留在RAM中。你是什​​麼操作系統的頁面文件設置?

0

這是一個不容錯過的「陷阱」。

http://www.xavierdecoster.com/post/2011/02/15/console-application-visual-studio-gotcha-on-x64-os-aspx

或最近更新的URL

http://www.xavierdecoster.com/post/2011/02/15/console-application-visual-studio-gotcha-on-x64-os

「爲.NET 4創建一個新的Visual C#控制檯應用程序VS2010時。0,項目的默認目標設置是目標,而不是任何CPU(MSIL)如Visual Studio x86平臺2008年做」

檢查您的csproj的性能(尤其是如果它是一個控制檯應用程序)

+0

http://www.xavierdecoster.com/post/2011/02/15/console-application-visual-studio-gotcha-on-x64-os-aspx link沒有找到 – Kiquenet 2014-03-25 18:02:13

+0

這就是爲什麼我粘貼相關信息在我的答案離子。引號內的東西。 – granadaCoder 2014-03-26 12:44:18

+0

沒有找到xavierdecoster的新博文中的鏈接嗎? – Kiquenet 2014-03-27 07:00:13