避免内存不足的异常在应用的最佳方式(Best way to avoid out of memory

2019-09-16 09:18发布

我们正在设计一个压力测试应用程序,这将的大小“1 MB”质量HTTP请求发送到特定的Web服务。 为了实现压力,我们正在使用的应用程序的多个线程。 结构是一样的东西,我们有这将创建的HTTPRequest数据X EnqueueThreads,他们将它们添加它到队列中。 和Y WorkerThreads将出列的要求,他们将提交给Web服务。 所有的请求都aysnchronous。 现在,这里的问题是,排队线程正在比WorkerThreads快很多,所以如果没有停止/等待条件,他们将直到内存溢出异常被抛出加入请求,从而使喷油器(如果该实用程序将运行)慢。 目前,我们正在处理内存溢出的异常,使得enqueuethreads睡了一段时间。 我能想到的另一种方式是限制队列的大小。

不过,我想知道什么应该是用有限的系统资源(特别是内存)的最佳方法的看法? 提前致谢。

Answer 1:

那么,根据问题的话题,最好的方式,以避免内存不足的异常会不会创建该内存填充对象。

处理异常是最简单的解决方案,但可能会带来不同的困难和矛盾与时间的应用程序。 另一种方式是让这样的内存资源可用大小:

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

然后你就可以基于一个对象存储容量估计计算你的队列的长度。

另一种方法是,以检查每个工作线程的内存大小。 每当有没有内存,线程可以只是完成。 这样,许多线程将产卵和死亡,但该应用程序会以最大可用容量。



Answer 2:

你可以,而且也应该使用MemoryFailPoint类在这样的情况下。

如果你得到一个OutOfMemoryException异常 ,那么应用程序的状态可能已损坏,你不应该试图从中恢复。 MemoryFailPoint旨在通过允许您确定多少放慢您的应用程序,以便你能避免失控的内存,以避免这种情况。 你让框架确定是否可以执行的操作,而不是采取一种猜测多少你“想”你可以逃脱根据您的应用程序使用多少内存。

你也应该通过垃圾收集器检查内存使用率不过程中得到的实际多少托管内存分配精确的读数。 使用专用内存的大小会给你一个非常低的阅读,你仍然可以登陆了在内存不足的情况下,虽然看起来你有充足有余。

在MSDN页上的代码示例演示了如何估算内存使用的操作,并使用这些信息要等到内存是试图处理更多的请求之前使用。 如果你能确定有大内存需求的代码领域,这是一个很好的选择来约束,并避免运行内存。



文章来源: Best way to avoid out of memory exception in application