在最近的一篇文章中(我的程序从不释放内存。为什么?)我展示了在使用 FastMM 时,应用程序不会将大量内存释放回系统。最近我创建了一个人工测试程序,以确保它不是内存问题,并且它只出现在 FastMM 中。
在这个程序中,我创建和销毁一个对象(与上一篇文章中使用的对象相同)500 次。
内存要求是(“私人工作集”):
没有 FastMM
运行循环前:1.2MB
运行循环后:2.1MB
使用 FastMM(积极调试模式)
运行循环前:2.1MB
运行循环后:25MB
使用 FastMM(释放模式)
运行循环前:1.8MB
运行循环后:3MB
如果我多次运行循环,内存需求不会增加。这意味着未释放的内存被重新使用,因此这不是内存泄漏(内存泄漏会增加内存占用,每次运行时会增加几个 KB/MB)。
我的问题是:
如何在 FastMM 中禁用此行为?甚至可能吗?我知道,如果我在没有 FastMM 或 FastMM 发布模式的情况下发布程序,它将“浪费”适量的 RAM。但是按需禁用此行为将帮助我(我们?)识别内存泄漏。实际上,在我的第一篇文章(见链接)中,很多人认为我有泄密。显然,正是因为这种行为,才造成了混乱。不,很明显没有泄漏。只是内存管理器拒绝释放大量内存。
它会释放额外的内存吗?什么时候?是什么触发了这个?程序员可以触发吗?例如,当我知道我已经完成了一项 RAM 密集型任务并且用户可能暂时不使用该程序(最小化它)时,我可以将 RAM 刷新回系统吗?当用户打开我的程序的多个实例时会发生什么?他们不会争夺内存吗?