在抛出OutOfMemoryException之前调用GC.Collect

Sep*_*eph 2 .net garbage-collection out-of-memory

有没有办法在抛出OutOfMemoryException之前调用GC.Collect()?

我想我正在寻找一种方法来执行以下代码流程:

Try to Allocate Memory
On Pass Return
Call GC.Collect()
Try to Allocate Memory
On Fail Throw New OutOfMemoryException()
Run Code Online (Sandbox Code Playgroud)

我正在写一个缓存实现,目前我正在遇到内存异常,所以目前解决它我正在使用:

If GC.GetTotalMemory(False) >= cache.CacheMemoryLimit + (100 * 1024 * 1024) Then
    // When Total Memory exceeds CacheMemoryLimit + 100MB
    GC.Collect()
End If
Run Code Online (Sandbox Code Playgroud)

小智 5

也许我不理解你的问题,但你不可能只是抓住OutOfMemoryException抛出并在那里调用GC.Collect吗?将try/catch放在一个循环中,直到你完成任务并确保它能够自我清理为止.

bool isFinished = false;
while (isFinished) {
  try {
    // do operations in here
  } catch (OutOfMemoryException oom) {
    GC.Collect();
  }

  // if you're done...
  isFinished = true;
}
Run Code Online (Sandbox Code Playgroud)

原谅使用C#伪代替VB,我尽量不在VB中工作,除非我别无选择.


Jug*_*ist 5

实际上.NET会很乐意抛出内存不足的异常,而不是垃圾收集和成功.这是我对微软.net实现的几个抱怨之一.在一个或多个线程中分配并立即丢弃大量内存的单元测试似乎已通过.然而,一旦大批老一代人超出范围,我认为问题就开始了.那些东西不会马上被拿走.

因此,例如,如果您的代码一次从磁盘上读取一百万个XmlDocuments,那么除非GC.Collect()每隔几个文档,否则您将获得OutOfMemory异常是合理的.

编辑:http://social.msdn.microsoft.com/forums/en-US/clr/thread/52a7eb17-ac05-470c-b063-a78427cd4406/