gpt4 book ai didi

delphi - 何时调用SetProcessWorkingSetSize? (说服内存管理器释放内存)

转载 作者:行者123 更新时间:2023-12-03 02:42:52 24 4
gpt4 key购买 nike

在上一篇文章 ( My program never releases the memory back. Why? ) 中,我展示了 FastMM 可以缓存(读取为自身保留)相当大量的内存。如果您的应用程序刚刚在 RAM 中加载了一个大型数据集,那么在释放数据后,您会发现大量 RAM 没有释放回内存池。

我环顾四周,似乎调用 SetProcessWorkingSetSize API 函数会将缓存“刷新”到磁盘。但是,我无法决定何时调用此函数。我想在执行 RAM 密集型操作的按钮上的 OnClick 事件结束时调用它。然而,有些人说这可能会导致 AV。

如果有人成功使用此功能,请告诉我(我们)。

非常感谢。

<小时/>

编辑:
1. 释放数据集后,程序仍然占用大量RAM。调用 SetProcessWorkingSetSize 后,大小返回到几 MB。一些人认为没有任何东西被释放回来。我同意。但内存占用现在很小,并且在正常使用程序后(例如,在执行不涉及加载大型数据集的正常操作时),它不会增加。不幸的是,没有办法证明交换到磁盘的内存曾经被加载回内存,但我认为事实并非如此。2.我已经证明(我希望)这不是内存泄漏:
My program never releases the memory back. Why?
How to convince the memory manager to release unused memory

最佳答案

如果 SetProcessWorkingSetSize 可以解决您的问题,那么您的问题不在于 FastMM 占用内存。因为此函数只是通过将 RAM 中的内存写入页面文件来修剪应用程序的工作集。没有任何内容被释放回 Windows。

事实上,您只是再次降低了访问内存的速度,因为现在必须从光盘读取内存。此方法与最小化您的应用程序具有相同的效果。然后 Windows 会假定您不会很快再次使用该应用程序,并将 RAM 中的工作集写入页面文件。 Windows 在决定何时将 RAM 写入页面文件方面做得很好,并尝试尽可能长时间地将最常用的内存保留在 RAM 中。当 RAM 剩余很少时,它将使工作集大小变小(写入页面文件)。我不会只是为了给人一种你的程序使用更少内存的错觉,而实际上它使用的内存和以前一样多,只是现在访问速度更慢。再次访问的内存将再次加载到 RAM 中,并使工作集大小再次增长。接触更少的内存可以使工作集大小更小。

所以不,这不会帮助您强制 FastMM 释放内存。如果您的目标是让应用程序使用更少的内存,您应该寻找其他地方。寻找泄漏、寻找堆碎片、寻找优化,如果您认为 FastMM 阻止您这样做,您应该尝试找到事实来支持它。如果您的目标是保持工作集大小较小,您可以尝试将内存访问保持在本地。也许 FastMM 或其他内存管理器可以帮助您解决这个问题,但与使用大量内存相比,这是一个非常不同的问题。也许这个函数确实可以帮助你解决你遇到的问题,但我会小心使用它,当然不会只是为了保持你的程序内存使用率低的错觉而使用它。

关于delphi - 何时调用SetProcessWorkingSetSize? (说服内存管理器释放内存),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4493917/

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