捕获 OutOfMemory 异常 C#
Catching an OutOfMemory Exception 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
具有非常大的值,因此根据可用内存量,这有时会引发 OutOfMemory 异常。
所以我一直在努力做的是:
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 异常。有更好的方法吗?
您可能需要重新设计 该算法,使其不会尝试将 "everything" 放入队列中...或者,也许, 根本不使用队列。例如,这里可以使用 iterator 吗?
LongMethod
的逻辑,目前表示为双嵌套循环,可以 等效地表示为一种算法(给定 struct
在调用之间 "hold state"),returns(或 "yields")每次一个新的 object()
。
该算法的重新表达将使您免于生成大量对象 "all at once," 并将它们放入队列中的义务 "all at once." 相反,它可能会生成对象一次 "on demand," and/or 生成和排队 "some" 个对象,同时保留在将来某个时间生成 "more of them" 的能力。
你真的不能 "catch" 一个 OOM 异常:当这样的事情发生时,"the program is already nine-tenths dead in the water, and almost certain to quickly finish drowning."你需要某种算法重新设计来消除 "such a massive 'queue.'"
希望有人能帮帮我,我没主意了!
我有一个创建对象并将其放入队列的密集方法。它看起来很像:
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
具有非常大的值,因此根据可用内存量,这有时会引发 OutOfMemory 异常。
所以我一直在努力做的是:
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 异常。有更好的方法吗?
您可能需要重新设计 该算法,使其不会尝试将 "everything" 放入队列中...或者,也许, 根本不使用队列。例如,这里可以使用 iterator 吗?
LongMethod
的逻辑,目前表示为双嵌套循环,可以 等效地表示为一种算法(给定 struct
在调用之间 "hold state"),returns(或 "yields")每次一个新的 object()
。
该算法的重新表达将使您免于生成大量对象 "all at once," 并将它们放入队列中的义务 "all at once." 相反,它可能会生成对象一次 "on demand," and/or 生成和排队 "some" 个对象,同时保留在将来某个时间生成 "more of them" 的能力。
你真的不能 "catch" 一个 OOM 异常:当这样的事情发生时,"the program is already nine-tenths dead in the water, and almost certain to quickly finish drowning."你需要某种算法重新设计来消除 "such a massive 'queue.'"