java - 如何实现仅在可用内存不足时才将数据交换到磁盘的写入缓存

标签 java memory-management garbage-collection

我想在内存中缓存我的应用程序产生的数据,但如果内存不足,我想将数据交换到磁盘。

理想情况下,我希望 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/

相关文章:

c++ - 如何正确地释放指向对的指针列表?

java - 如何在窗口关闭后正确停止 Java 小程序

java - 从 spring-boot-starter-web 中排除 Logback 依赖项会阻止 log4j 系统正确初始化

java - 将大量 XML(文件对象)转换为包含所有文件内容的单个字符串

c# - 无法检测 .NET 中的非托管内存分配

java - 如何避免GC暂停?

memory-leaks - 禁用D的GC是 'ok'吗?

Java:G1 老年代垃圾回收计数为 0

java - 如何使用 Intellij Idea 的异常断点

java - 从文件读取数据到jtextfield1并显示在jtextfield2中