2016-08-10 124 views
1

希望有人可以帮助我,我不知道!捕捉OutOfMemory异常C#

我有一个密集的方法,创建一个对象并将其放入队列中。它看起来很像:

private void LongMethod() 
    { 
    for (int i=0; i<number;i++) 
    { 
     for (int j=0; j<number; j++) 
     { 
     object o = new object(); 
     queue.enqueue(o); 
     } 
    } 
    } 

但是,有时number具有非常大的价值等取决于可用内存量,这有时会引发内存不足异常。

所以我一直试图做的是这样的:

private bool CheckingMethod(number) 
{ 
long initialValue = System.Diagnostics.Process.GetCurrentProcess().PrivateMemorySize64; 

object o = new object(); 
queue.Enqueue(o) 

long difference = initialValue - System.Diagnostics.Process.GetCurrentProcess().PrivateMemorySize64; 

if(Microsoft.VisualBasic.Devices.ComputerInfo.TotalPhysicalMemory <= difference * number * number) 
    { 
    return true; 
    } 
    return false; 
} 

然后调用方法可以这样做:

private void CallingMethod(number) 
    { 
    if(CheckingMethod(number) 
     { 
     LongMethod(number); 
     } 
    } 

我试图运行longMethod前检查,是否将导致OOM异常。我的问题是,difference会给我一个截然不同的值,所以我有时仍然遇到outOfMemory异常。有一个更好的方法吗?

+0

'数字'有多大?你分配的物体有多大? –

+0

选择正确的数据类型是正确的方法... –

+0

@MitchWheat数字是一个用户输入,其思想是允许可能的最高'数字',而不会引发异常。这就是我想要弄明白的。我想知道每个对象使用多少内存。 –

回答

3

很可能你需要重新设计这个算法,这样它就不会试图把“所有东西”放入队列......或者根本不使用队列。例如,在这里可以使用迭代器

LongMethod所述的逻辑,其中目前表示为双嵌套循环,可以被等效地表达为(假设某种呼叫之间为“保持状态”的struct)的算法,返回(或“屈服”)每次新的object()

该算法的重新表达可以使您免除“一次全部生成”大量对象的义务,并将它们放入队列中“全部一次”。相反,可以按需“一次一个”地产生对象,和/或产生和排列“一些”对象,同时保留在将来某个时间产生“更多”对象的能力。

你真的不能“捕捉”OOM异常: 当这种事情发生时,“该计划已经在水中死亡十分之九,几乎肯定会迅速完成溺水。”您需要重新设计某种算法,从而不需要“如此庞大的队列”。“