gpt4 book ai didi

delphi - 如何说服内存管理器释放未使用的内存

转载 作者:行者123 更新时间:2023-12-03 15:03:01 26 4
gpt4 key购买 nike

在最近的一篇文章 ( My program never releases the memory back. Why? ) 中,我展示了使用 FastMM 时,应用程序不会将大量内存释放回系统。最近,我创建了一个人工测试程序,以确保问题不是内存问题,并且仅在 FastMM 中出现。

在这个程序中,我创建和销毁一个对象(与上一篇文章中使用的对象相同)500 次。

内存要求为(“私有(private)工作集”):

没有 FastMM
运行循环之前:1.2MB
运行循环后:2.1MB

使用 FastMM(主动 Debug模式)
运行循环之前:2.1MB
运行循环后:25MB

使用FastMM( Release模式)
运行循环之前:1.8MB
运行循环后:3MB

如果我多次运行循环,内存需求不会增加。这意味着未释放的内存被重新使用,因此这不是内存泄漏(内存泄漏会在每次运行时增加几 KB/MB 的内存占用)。

<小时/>

我的问题是:

如何在 FastMM 中禁用此行为?有可能吗?我知道,如果我在没有 FastMM 或使用 FastMM Release模式的情况下发布程序,它将“浪费”适量的 RAM。但是按需禁用此行为将帮助我(我们?)识别内存泄漏。实际上,在我的第一篇文章(参见链接)中,很多人建议我有泄漏。显然正是因为这种行为才造成了困惑。不,很明显没有泄漏。只是内存管理器拒绝释放大量内存。

它会释放额外的内存吗?什么时候?是什么触发了这个?程序员可以触发吗?例如,当我知道我已经完成了一项 RAM 密集型任务,并且用户可能有一段时间不会使用该程序(最小化它)时,我可以将 RAM 刷新回系统吗?当用户打开我的程序的多个实例时会发生什么?他们不会争夺内存吗?

最佳答案

您真的不应该将其视为“浪费”RAM。将其视为“缓存”未使用的 RAM。出于某种原因,内存管理器保留未使用的内存而不是将其释放回操作系统,事实上您在问题中已经找到了这个原因。

您说过您不断在循环中重新运行相同的操作。当您这样做时,它仍然具有可用的旧内存,并且可以立即分配它,而不必向 Windows 请求新的堆 block 。这是将“Fast”放入“FastMM”的技巧之一,如果不这样做,您会发现程序运行速度要慢得多。

您无需担心 FastMM Debug模式图。这仅用于调试,并且您不会发布针对 FullDebugMode 编译的程序。而“不使用 FastMM”和“使用 FastMM Release模式”之间的差异约为 1 MB,这在现代硬件上可以忽略不计。只需额外增加 1 MB 的低成本,您就能获得巨大的性能提升。所以不用担心。

关于delphi - 如何说服内存管理器释放未使用的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4475592/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com