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

前端之家收集整理的这篇文章主要介绍了delphi – 如何说服内存管理器释放未使用的内存前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在最近的一篇文章( My program never releases the memory back. Why?)中,我展示了使用FastMM时,应用程序不会将大量内存释放回系统.
最近我创建了一个人工测试程序,以确保它不是一个内存的问题,它只出现在FastMM中.

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

内存要求是(“私人工作集”):

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

使用FastMM(积极的调试模式)
在运行循环之前:2.1MB
运行循环后:25MB

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

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

我的问题是:

如何在FastMM中禁用此行为?它甚至可能吗?我知道,如果我在没有FastMM或FastMM发布模式的情况下发布程序,它将“浪费”适量的RAM.但是,根据需要禁用此行为,将帮助我(我们?)识别内存泄漏.实际上在我的第一篇文章中(见链接),很多人都认为我有泄漏.由于这种行为,显然造成了混乱.不,很明显没有泄漏.只是内存管理器拒绝释放大量内存.

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

解决方法

你不应该把它当作“浪费”RAM,真的.将其视为“缓存”未使用的RAM.内存管理器正在抓住未使用的内存,而不是因为某种原因将其释放回操作系统,事实上你已经在问题中找到了这个原因.

你说你继续在循环中重新运行相同的操作.当你这样做时,它仍然有可用的旧内存,它可以立即分配它,而不必向Windows请求一大堆新的堆.这是将“Fast”置于“FastMM”中的技巧之一,如果它没有这样做,你会发现你的程序运行得慢得多.

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

猜你在找的Delphi相关文章