簡體   English   中英

使用double數組時內存泄漏

[英]Memory leaks while using array of double

我有一部分代碼可以在大型double數組上運行(至少包含大約6000個元素)並執行數百次(通常為800次)。

當我使用標准循環時,像這樣:

double[] singleRow = new double[6000];
int maxI = 800;
for(int i=0; i<maxI; i++)
{
singleRow = someObject.producesOutput();
//...
// do something with singleRow
// ...
}

內存使用量增加約40MB(從循環開始時的40MB到最后的80MB)。

當我強制使用垃圾收集器在每次迭代時執行時,內存使用量保持在40MB的水平(上升是無關緊要的)。

double[] singleRow = new double[6000];
int maxI = 800;
for(int i=0; i<maxI; i++)
{
singleRow = someObject.producesOutput();
//...
// do something with singleRow
// ...
GC.Collect()
}

但是執行時間要長3倍! (這很關鍵)

如何強制C#使用相同的內存區域而不是分配新內存? 注意:我可以訪問someObject類的代碼,所以如果需要,我可以更改它。

為什么要分配一個大的空singleRow只是為了覆蓋它? 也許你應該傳入數組來修改它的值。 這將允許您重用它。

double[] singleRow = new double[6000];
int maxI = 800;
for(int i=0; i<maxI; i++)
{
    someObject.FillWithOutput(singleRow);
    //...
    // do something with singleRow
    // ...
}

如果該方法有時填充少於6000個元素,則它可以簡單地返回填充計數。 或者,您可以使用List<double> ,這將允許調整大小。

singleRow一個參數,並把它傳遞到調用producesOutput每次...

基本上你producesOutput方法每次可能分配一個新的數組,並重新分配singleRow只是標志着舊的內存為可用來去除,但不運行出於性能考慮GC。

你不會喜歡這個,但如果你不得不強迫GC你做錯了什么。 請記住,內存可能會增長,直到觸發GC的壓力 - 這是一件好事,因為這意味着GC必須運行才能運行。

這是一個愚蠢的測試,但它可能會揭示正在發生的事情。 在FillWithOutput()里面注釋掉它的大部分功能。 然后運行你的循環並測量記憶。 逐漸取消它的一部分,直到你看到一個短暫的。 現在你越來越接近導致'泄漏'的原因。

暫無
暫無

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

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