我们正在设计一个压力测试应用程序,它将大小为“1 MB”的大量HTTP请求发送到特定的Web服务。为了实现压力,我们在应用程序中使用多个线程。结构类似于我们有X EnqueueThreads,它将创建HTTPRequest数据,并将它们添加到队列中。 Y WorkerThreads会将请求出列,他们将提交给Web服务。 所有请求都是一个令人讨厌的。 现在的问题是,Enqueue线程的工作速度比WorkerThreads快得多,所以如果没有停止/等待条件,它们将添加请求,直到抛出内存不足异常,从而生成注入器(此实用程序将在其中运行)慢。 目前我们正在处理OutOfMemory异常并让enqueuethreads睡了一段时间。我能想到的另一种方法是限制队列大小。
但是,我想知道有关使用有限系统资源(特别是内存)的最佳方法的观点。 提前谢谢。
答案 0 :(得分:4)
你可以而且可能应该在这样的场景中使用MemoryFailPoint class。
如果您获得OutOfMemoryException,则应用程序状态可能已损坏,您不应尝试从中恢复。 MemoryFailPoint旨在通过允许您确定减慢应用程序的速度来避免这种情况,以避免内存不足。您正在让框架确定您是否可以执行操作,而不是根据应用程序使用的内存量来猜测您可以“思考”多少。
您还应该check for memory usage through the garbage collector而不是准确读取实际分配了多少托管内存的过程。使用私有内存大小会给你一个低得多的读数,你仍然可以在内存不足的情况下登陆,虽然看起来你有足够的余地。
MSDN页面上的代码示例显示了如何估计操作的内存使用情况,并在尝试处理更多请求之前使用该信息等待内存可用。如果您可以确定具有大内存要求的代码区域,则可以选择约束它并避免内存不足。
答案 1 :(得分:3)
那么,根据问题的主题,避免内存不足异常的最佳方法是不创建填充该内存的对象。
处理异常是最简单的解决方案,但随着时间的推移可能会给应用程序带来不同的困难和不一致。另一种方法是获得可用的内存资源大小:
Process currentProcess = Process.GetCurrentProcess();
long memorySize = currentProcess.PrivateMemorySize64
然后,您可以根据一个对象内存容量的估计值来计算队列的长度。
另一种方法是检查每个工作线程中的内存大小。只要没有内存,线程就可以完成。这样很多线程就会产生和死亡,但应用程序将处于最大可用容量。