我想在内存中缓存我的应用程序产生的数据,但如果内存不足,我想将数据交换到磁盘。
理想情况下,我希望 VM 通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存。但是我看不出有什么方法可以在 OutOfMemoryError
发生在某处时通知我(很可能在与缓存无关的代码中)任何方式)。
java.lang.ref
中的 Reference 类在这种情况下似乎没有任何用处,它们的通知机制(ReferenceQueue
)仅在引用已完成后触发已经被GC回收了。然后将数据保存到磁盘就太晚了。
有哪些替代方法可以有效地管理堆内存? (除非绝对不可避免,否则不要交换到磁盘)
Edit1:针对“操作系统已经为您完成了”的评论 - 这只涵盖了部分问题 - 操作系统可以分配的内存量 是一种有限的资源。除了此处需要考虑的操作系统可用内存量之外,还有其他限制:
- VM 架构(
32 位 VM
)施加的限制 - 可分配给 VM 进程的内存限制(
32 位操作系统
) - 使用
-Xmx
选项可能对 VM 施加的限制
简单地运行具有无限堆大小的 VM 不会阻止它耗尽内存,即使操作系统仍然有足够的可用空间,但由于上述原因它可能无法用于 VM。
最佳答案
我建议您使用一些 API 调用来监控可用的空闲内存并采取相应措施。
参见 this question关于如何监控 JVM 可用内存量的信息。
关于java - 如何实现仅在可用内存不足时才将数据交换到磁盘的写入缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8431969/