[英]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.