【问题标题】:C# .Net Close application on exceeding memory usageC# .Net 在超出内存使用量时关闭应用程序
【发布时间】:2013-07-05 07:23:07
【问题描述】:

我有一个处理大量内存数据的应用程序。现在,有时会发生 2GB/app 的内存限制并且我的程序挂起。任务管理器中的内存使用变得混乱(从 2GB 到 6GB 不断波动) 我想要的是,当内存使用量达到特定限制时,程序应该优雅地退出。我不想手动干预用户杀死应用程序。这可能吗?

【问题讨论】:

  • 重写应用程序以不耗尽所有可用内存和/或跟踪内存泄漏(如果它没有按设计使用所有内存)不是更好吗?
  • 你有没有想过用户会有什么感觉,在它弹出一条消息“抱歉内存阈值达到..gotta go”时,他会撞到他的头:(
  • 您所说的数据量有多大?处理数 TB 的数据也可以通过适当的编码和设计进行管理。我认为您应该尝试改进您的应用程序。我很乐意了解您的应用程序的更多信息...
  • 其实没有内存泄露的问题。内存使用是设计使然。而且我不知道程序需要多少内存。这取决于数据库表的大小。
  • “这取决于 DB 表的大小” - 你需要内存中的所有数据吗?

标签: c# .net


【解决方案1】:

您应该分配一个后台监控线程,它轮询 System.Diagnostics.Process.GetCurrentProcess().PrivateMemorySize64,然后根据返回的大小采取相应措施。

例如。

public class MonitoringThread : Thread{
...

bool working = true;
void run(){
   while(working){
      long size = Process.GetCurrentProcess().PrivateMemorySize64;
      if (size > 2000000000){
         //do anything
      }
      else {
         try{
            Thread.Sleep(1000);
         }
         catch{}
      }
   }
}

}

请注意,我只是在这个页面上写了这段代码,所以可能不太准确:)

【讨论】:

  • 您应该在询问当前提交内存大小之前调用Process.Refresh(); - msdn.microsoft.com/en-us/library/…
  • 不,我没有存储 Process 的引用正是因为这个原因:每次调用“Process.GetCurrentProcess()”都会拍摄一个新的进程快照而不缓存它。
  • 你说得对,我假设Process.GetCurrentProcess()缓存了对当前进程的引用,但它每次都会创建一个新对象。
  • 我认为这两种解决方案都是正确且等效的:只是我没有看到需要分配一个对象,然后我必须刷新,覆盖它。 :)
  • 谢谢@LittleSweetSeas 似乎是一个足够好的解决方案。我仍然想在将此标记为答案之前尝试一下。
【解决方案2】:

您可以使用Garbage Collection Notifications 在完整的垃圾收集完成时收到警报。

对此,您可以检查GC.GetTotalMemory() 以查看当前使用了多少内存,如果内存太高,请采取适当的措施。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多