如何为我的应用程序保留内存并保留指定的金额?

Jer*_*dge 8 delphi memory-management delphi-7

我正在计划一个应用程序,它将涉及一次加载许多图片,因此需要大量的内存.例如,我可能一次创建50个图像对象,总共占用1GB的RAM.但是当用户再加载20张图片时,我想确保已预留并准备好内存量.

现在这部分看起来似乎与正常情况有些相反.而不是指定我的应用程序应保留多少内存,而是我需要指定为其他应用程序保留多少内存,并根据此规范定期调整应用程序的内存.我必须说我从来没有使用过保留内存,特别是不知道如何留下剩余的可用内存.

因此,例如,如果计算机具有2048 MB的RAM,并且该选项设置为其他应用程序可以免费使用50 MB,并且其他应用程序已经使用了10 MB的RAM,那么它应该保留2048-50-10 = 1988 MB我的应用程序.

我预见的麻烦是假设用户打开另一个需要1GB的应用程序.我的应用程序必须抓住这个并缩小其自我.

这甚至听起来像一个可行的方法吗?基本上,我需要确保在任何给定时间尽可能多地保留内存,同时为其他应用留下相当多的内存.如果我这样做,或者根本没有多少,它会对性能产生重大影响吗?我可能正在快速加载和卸载图像,我不希望它按需保留/释放这些内存,我希望它保留.

Ian*_*oyd 8

Sertac提到SQL Server如何使用所需的内存来分配内存,但在Windows抱怨时释放内存.

应用程序可以通过以下方式接收Window的投诉CreateMemoryResourceNotification:

hLowMemory := CreateMemoryResourceNotification(LowMemoryResourceNotification);
Run Code Online (Sandbox Code Playgroud)

应用程序可以使用内存资源通知事件来适当缩放内存使用情况.如果可用内存不足,应用程序可以减少其工作集.如果可用内存很高,则应用程序可以分配更多内存.

调用进程的任何线程都可以在对QueryMemoryResourceNotification函数或其中一个等待函数的调用中指定内存资源通知句柄.当指定的内存条件存在时,将发出对象状态的信号.这是一个系统范围的事件,因此所有应用程序都会在发出对象信号时收到通知.请注意,存在一系列内存可用性,其中LowMemoryResourceNotificationHighMemoryResourceNotification对象均未 发出信号.在这种情况下,应用程序应尝试保持内存使用不变.

但是值得一提的是,你也可以分配你需要的内存.您的操作系统有一套非常复杂的算法,可在内存压力较高时更换最少使用的内存.您可以通过简单地分配所需的所有内存来利用这一点.当Windows开始运行不足时,它会找到您使用最少的内存页并将它们交换到磁盘.(这是众所周知的反向代理的工作原理).

唯一剩下的就是当Windows说它在RAM上运行不足时,决定是否要释放一些图像.但是,如果您没有使用内存,它将被替换为磁盘.


Dav*_*nan 7

考虑其他应用程序是不现实的.只是忽略它们.系统将根据需要将内容分页.如果你真的想这样做,你必须在开始和结束时动态适应其他过程.这真的不太现实.更重要的是,询问其他进程需要多少内存是不切实际的.将所有内容留给系统.

为您的应用设置预算,并确保不超过它.将最近使用的图像保存在内存中,当您接近内存预算时,丢弃最近最少使用的图像以腾出空间.

如果您要强调可用资源,请确保使用FastMM并LARGE_ADDRESS_AWARE为您的应用启用,以便在64位操作系统上运行时获得4GB的地址空间.

  • 你不仅需要它用于LARGE_ADDRESS_AWARE,它甚至可以找到悬空指针访问!;-) (4认同)