You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GC.AddMemoryPressure致非托管内存增长?是否为内存泄漏?

关于GC.AddMemoryPressure/RemoveMemoryPressure导致非托管内存增长的问题分析

这不属于内存泄漏,只是dotMemory的统计逻辑和CLR内存压力管理机制共同导致的表象,实际没有内存被持续占用。

原因解析:

  • GC.AddMemoryPressure和GC.RemoveMemoryPressure的核心作用是向CLR传递"存在未被托管堆跟踪的非托管内存"的信号,让GC根据这个压力值调整回收时机,避免内存不足。它们本身不会分配实际的非托管内存,只是修改CLR内部的压力计数器。
  • dotMemory的非托管内存统计基于采样机制:当你快速连续调用Add和Remove时,采样操作可能刚好落在Add执行后、Remove执行前的窗口,导致每次采样都捕捉到一个临时的压力值,视觉上呈现出“增长”的趋势。
  • .NET Framework 4.7.2和.NET 5的CLR对内存压力的实现细节有差异,但本质都是维护内部计数器,快速的加减操作加上采样延迟,会让统计数据出现波动式的“增长”,但实际计数器最终会回到平衡状态,没有内存泄漏。

验证方式:

如果修改测试代码,延长Thread.Sleep的时间(比如改为100ms),或者在循环内手动触发GC.Collect()(仅用于测试场景),会发现非托管内存不会持续攀升,而是在一个极小的范围内波动,证明没有内存被泄漏。

测试代码

var size = 1920 * 1080 * 3 / 2;

for (int i = 0; i < int.MaxValue; i++)
{
    GC.AddMemoryPressure(size);
    GC.RemoveMemoryPressure(size);
    Thread.Sleep(1);
}

内容的提问来源于stack exchange,提问作者dmitriy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 20:55:30