当前位置: 首页 > 编程语言 > C#

如何使用MemoryFailPoint?分享

时间:2023-04-10 14:02:53 C#

我如何使用MemoryFailPoint?MemoryFailPoint(MSDN)“在执行操作之前检查是否有足够的内存资源。”但实际如何使用呢?MemoryFailPoint会自动为我创建的下一个大对象保留一些内存吗?或者它只是检查内存是否空闲,而不是保留它?它会检查物理内存、物理内存加页面文件、虚拟地址空间还是其他东西?我什么时候处理它?我是否需要在实际创建内存消耗大的对象之前部署MemoryFailPoint,还是必须在部署MemoryFailPoint之前创建对象?例如尝试{using(MemoryFailPointmem=newMemoryFailPoint(500)){//在这里分配大对象?}}catch(InsufficientMemoryExceptione){//...}//或者在这里分配大对象?//或者在另一个线程上分配大对象?同一进程中的另一个线程是否可以窃取我使用MemoryFailPoint保留的内存,或者MemoryFailPoint是否专门为当前线程保留内存?如果不丢弃MemoryFailPoint会怎样?一个不相关的MemoryFailPoint本身会消耗大量内存吗?MemoryFailPoint的源代码可从.NETSource获得。课程开头的描述性评论回答了您的问题。我在此处复制该评论以便于参考:此类允许应用程序在启动某些活动之前失败。这个想法是尽早失败,而不是在一些长时间运行的操作中,以提高应用程序的生存能力,并确保您不必编写棘手的代码来处理应用程序代码中任何位置的OOM(意味着状态损坏,这意味着您应该卸载AppDomain,如果您有事务环境以确保回滚单个事务)。这是一个不完整的工具,它试图将所有OOM失败从工作方法中的任何地方提升到更容易处理OOM失败的特定点,如果工作项可能失败,您可以选择不启动它。这对直接执行代码没有帮助(除了帮助避免AD卸载)。关键是要避免在可能失败的情况下开始工作。十年来,企业服务团队在不受管理的世界中有效地使用了这些内存门。在Whidbey中,我们只需检查操作系统页面文件中是否有足够的可用内存,并尝试确保进程的地址空间中有足够的可用空间(同时检查地址空间碎片)。我们不提交或保留任何记忆。为了避免使用来自其他线程的MemoryFailPoints,我们还通过所有当前活动的MemoryFailPoints跟踪进程范围内“保留”的内存量。这样有两个问题:1.这样会占内存两倍。如果线程创建100MB的MemoryFailPoint然后分配99MB,我们将看到99MB的空闲内存和100MB的保留内存。然而,减去100MB是必要的,因为线程可能还没有开始分配内存。在前端加载分配完成后立即处理此类是一个好主意。2.这仍然容易受到其他不使用MemoryFailPoints的线程的影响。所以这门课远非完美。但是,它可能足以显着降低托管应用程序中OutOfMemoryExceptions的频率。在Orcas或更高版本中,我们可能会从操作系统分配一些内存并将其添加到该线程的分配上下文中。显然,此时我们在释放内存时需要某种通信方式。因此,我们在Whidbey中为这种类型实现了IDisposable,并希望所有用户在使用块时调用它,为他们的内存使用提供词法范围。对Dispose的调用(暗示使用using块)将使我们有机会释放此内存。我们希望这将使我们有可能在未来的版本中更有效地进行设计。在Orcas中,我们可能还需要区分进入普通托管堆和大型对象堆的分配,或者我们应该考虑检查这两个地方是否有足够的可用空间(进行任何适当的调整以确保内存是连续的)。使用模式如下:constintsizeMB=500;using(MemoryFailPointmem=newMemoryFailPoint(sizeMB)){//在此处分配sizeMB-大对象。分配*可能*会成功。当MemoryFailPoint构造函数失败时,大型Object分配很可能会抛出OOM。即使成功,它也会使进程对其他(甚至更小的)内存分配操作不太稳定。在我的16GBWindows环境下,下面的例子产生InsufficientMemoryException,比没有MemoryFailPoint(step=6)的OOM早一个迭代(step=5):以上是C#学习教程:HowdoIuseMemoryFailPoint?分享的所有内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注——Listarrays=newList();constintsize=int.MaxValue/2;constintsizeMB=大小/1024/1024;for(intstep=0;step本文采集自网络,不代表立场,如涉及侵权,请点右联系管理员删除,转载请注明出处: