【问题标题】:Best way to avoid out of memory exception in application避免应用程序内存不足异常的最佳方法
【发布时间】:2012-04-06 04:56:31
【问题描述】:

我们正在设计一个压力测试应用程序,它将向特定的 Web 服务发送大小为“1 MB”的大量 HTTP 请求。为了实现压力,我们在应用程序中使用多个线程。结构类似于我们有 X EnqueueThreads,它将创建 HTTPRequest 数据并将其添加到队列中。 Y WorkerThreads 将使请求出列,并将它们提交给 Web 服务。 所有请求都是异步的。 现在的问题是,Enqueue 线程的工作速度比 WorkerThreads 快得多,因此如果没有停止/等待条件,它们将添加请求,直到抛出内存不足异常,从而使注入器(该实用程序将在其中运行)减缓。 目前我们正在处理 OutOfMemory 异常并使 enqueuethreads 休眠一段时间。我能想到的另一种方法是限制队列大小。

但是我想知道关于什么应该是使用有限系统资源(特别是内存)的最佳方法的观点。? 提前致谢。

【问题讨论】:

    标签: c# httpwebrequest out-of-memory


    【解决方案1】:

    在这种情况下,您可以并且可能应该使用MemoryFailPoint class

    如果您收到OutOfMemoryException,则应用程序状态可能已损坏,您不应尝试从中恢复。 MemoryFailPoint 旨在通过允许您确定降低应用程序的速度来避免这种情况,从而避免内存不足。您让框架确定您是否可以执行该操作,而不是根据您的应用使用的内存量来猜测您“认为”可以逃脱多少。

    您还应该check for memory usage through the garbage collector 而不是进程来准确读取实际分配了多少托管内存。使用私有内存大小将使您的读数低得多,并且您仍然可能陷入内存不足的情况,尽管看起来您有足够的余地。

    MSDN 页面上的代码示例显示了如何估计操作的内存使用情况,并使用该信息等到内存可用后再尝试处理更多请求。如果您可以确定需要大量内存的代码区域,这是限制它并避免内存不足的好选择。

    【讨论】:

      【解决方案2】:

      好吧,根据问题的主题,避免内存不足异常的最佳方法是不创建填充该内存的对象。

      处理异常是最简单的解决方案,尽管随着时间的推移可能会给应用程序带来不同的困难和不一致。另一种方法是获取可用大小的内存资源,如下所示:

      Process currentProcess = Process.GetCurrentProcess();
      long memorySize = currentProcess.PrivateMemorySize64
      

      然后您可以根据对一个对象内存容量的估计来计算队列的长度。

      另一种方法是检查每个工作线程中的内存大小。只要没有内存,线程就可以结束。这样一来,许多线程将产生和死亡,但应用程序将处于最大可用容量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-10-25
        • 2013-10-01
        • 2016-10-15
        • 1970-01-01
        • 2011-04-02
        • 1970-01-01
        • 2013-09-15
        相关资源
        最近更新 更多