分配的内存可以在需要时由操作系统释放
Allocating memory that can be freed by the OS if needed
我正在编写一个程序,为大文档中的每个页面生成缩略图。出于性能原因,我希望尽可能长时间地将缩略图保存在内存中,但我希望操作系统能够在决定有其他更重要的用途时(例如,用户已经开始运行不同的应用程序)回收内存。
如果内存耗尽,我可以稍后重新生成缩略图。
是否有任何跨平台的方法来标记内存可以被删除,如果需要?程序是用c++编写的。
编辑:只是为了澄清,而不是在内存低或定期监控系统的内存量时被通知,我更多地考虑分配内存,然后在不使用时"解锁"它。如果需要,操作系统可以窃取未解锁的内存(即使是磁盘缓冲区,如果它认为这将是一个更好的使用内存),我所要做的只是作为一个程序员在我打算使用它之前再次"锁定"内存。如果锁失败,我知道内存已经被其他东西重用了,所以我需要重新生成缩略图,如果锁成功,我可以继续使用以前的数据。
原因是我可能在屏幕上显示文档的20页,但我可能会保留其他200页左右的缩略图,以防用户滚动一下。但如果他们去做其他事情一段时间,这些内存可能更好地用作磁盘缓存或存储网页或其他东西,所以我希望能够告诉操作系统,它可以重用我的一些内存,如果它想要的话。
必须监控系统范围内的空闲内存数量可能无法实现目标(我的内存永远不会被回收以改善磁盘缓存),并且获得低内存通知只会在紧急情况下有所帮助。我希望通过使用lock/unlock方法,可以以更轻量的方式实现这一点,并使系统在非紧急情况下的性能受益。
是否有任何跨平台的方法来标记内存可以被删除,如果需要?该程序是用c++编写的
至少对于Windows,你可以注册一个内存资源通知。
HANDLE WINAPI CreateMemoryResourceNotification(
_In_ MEMORY_RESOURCE_NOTIFICATION_TYPE NotificationType
);
NotificationType
LowMemoryResourceNotification
可用物理内存不足HighMemoryResourceNotification
Available physical memory is high.
只是要小心响应和事件。你可能会创建一个反馈循环(内存低,释放缩略图!)然后内存高,制作所有缩略图)。
在AIX中,当可用内存不足时,会向应用程序发送一个SIGDANGER信号。你可以处理这个信号并释放一些内存。
在Linux中有一个关于在Linux中实现这个特性的讨论。但据我所知,它还没有在Linux中实现。也许他们认为应用程序不应该关心底层内存管理,它可以在操作系统中通过交换透明地处理。
在posix标准中,有一个函数posix_madvise
可以用来标记不太重要的内存区域。有一个通知POSIX_MADV_DONTNEED
指定应用程序期望在不久的将来它不会访问指定的范围。
但是不幸的是,当前的Linux实现会在posix_madvise
被调用时立即释放内存范围。
所以你的问题没有便携的解决方案。
然而,在几乎每个操作系统上,你都可以通过一些操作系统接口读取当前可用的内存。因此,当OS中的可用内存不足时,您可以常规地读取这些值并手动释放内存。
您不需要做什么特别的事情。操作系统会自动从内存中删除最近没有使用过的东西。有些操作系统有特定于平台的方法来改进这一点,但通常不需要特别的操作。
这个问题非常相似,而且答案涵盖了这里没有涉及的内容。分配"temporary"内存(Linux)
这应该不会太难,因为这正是页面缓存所做的,使用未使用的内存来缓存硬盘。理论上,有人可以编写这样一个文件系统,当您从某个文件中读取时,它会计算一些东西,页面缓存会自动缓存它。
自动释放缓存空间的所有基础都已经存在于任何带有磁盘缓存的操作系统中,很难想象没有一个API可以实现巨大的差异,特别是在移动web浏览器中。
- 释放错误后堆使用
- G锁定铸造到基础上会释放模拟行为
- 在将变量声明为引用时,堆在释放后使用
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 正在理解智能指针,但出现错误:未分配正在释放的指针
- 在C++中设置基于操作系统的文件路径
- C++双重释放或损坏(out)
- 如何在c++中释放内存
- 使用全局声明的向量时,C++双重释放错误/损坏
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 为什么瓦尔格林德在不释放恶意内存后没有报告任何问题?
- 调用析构函数以释放动态分配的内存
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- COM :是否可以查看是否存在对我的某个 COM 对象的进程外引用?我可以释放它吗?
- 如何在向量中释放指针?
- std::unordered_map析构函数不释放内存?
- 分配的内存可以在需要时由操作系统释放
- 强制释放内存到操作系统
- 在大量使用unique_ptr语言 - c++后释放内存给操作系统
- mmap小尺寸内存,当munmap为glibc时,会将映射内存释放到操作系统