.net GC.AddMemoryPressure()如何知道要向哪个对象添加内存压力?

.net GC.AddMemoryPressure()如何知道要向哪个对象添加内存压力?,.net,garbage-collection,.net,Garbage Collection,我最近需要使用它,但奇怪的是,它不接受要添加内存压力的对象作为参数。我假设,因为它与运行时紧密相连,所以有某种机制可以将这个指针传递给方法。我的问题有三个: 如何将this指针传递给该方法 我注意到当从静态方法调用它时没有抛出异常。在这种情况下会发生什么 为什么其他GC方法(如GC.superssFinalize和GC.ReRegisterForFinalize)在该方法不需要对象参数的情况下使用对象参数 不,它没有显式地与任何特定对象关联。假设在处置/最终确定时,同一物体将消除该压力。发件人:

我最近需要使用它,但奇怪的是,它不接受要添加内存压力的对象作为参数。我假设,因为它与运行时紧密相连,所以有某种机制可以将
这个
指针传递给方法。我的问题有三个:

  • 如何将this指针传递给该方法
  • 我注意到当从静态方法调用它时没有抛出异常。在这种情况下会发生什么
  • 为什么其他GC方法(如GC.superssFinalize和GC.ReRegisterForFinalize)在该方法不需要对象参数的情况下使用对象参数

  • 不,它没有显式地与任何特定对象关联。假设在处置/最终确定时,同一物体将消除该压力。发件人:


    在最简单的使用模式中,托管对象在构造函数中分配非托管内存,并在Dispose或Finalize方法中释放它。分配非托管内存后调用AddMemoryPressure方法,释放内存后调用RemoveMemoryPressure方法


    在更复杂的场景中,内存压力可能会随着时间的推移而变化,但仍需要相关对象的配合。

    AddMemoryPressure比正常情况下更快地启动垃圾收集器。这就是全部。当收集实例并且需要运行其最终程序时,抑制和注册用于最终化调用或非该类型的特定代码


    建议您仔细阅读垃圾收集器mate,您可能会发现不需要调用IncreaseMemoryPressure,或者几乎同样可能调用它会导致性能下降。

    我正在分配大量非托管内存,这是使用ConditionalWeakTable跟踪的。你是说在这种情况下我不需要调用AddMemoryPressure吗?不,这是一个很好的用法。如果您正确调用RemoveMemoryPressure。基本上,它告诉GC正在使用的内存比它知道的要多,因此它需要更主动地使用它所使用的内存。啊,好的,我假设这个内存压力与分配非托管内存的对象相关,即GC将优先考虑具有更大内存压力的对象进行收集。“分配非托管内存后调用AddMemoryPressure方法“。在分配之前调用该方法不是更有意义吗?否则,本机/非托管代码在分配时可能会不必要地耗尽内存,因为垃圾收集器不知道本机/非托管代码需要内存。@Chieltenbrink:我认为如果您在分配之前调用它,无论如何也不会给GC收集时间。