java - 在 Java 对象被垃圾收集之前对其进行回调

标签 java caching garbage-collection weak-references finalizer

背景故事:所以我有这个好主意,对吗?有时您正在收集大量数据,并且不需要一直访问所有数据,但在程序完成后您也可能不需要它,并且您真的不想浪费时间如果您有一个库,可以在您不使用对象时自动将对象静默序列化到磁盘,并在需要时静默将它们带回磁盘,该怎么办?所以我开始写一个库;它有许多集合,例如“DiskList”或“DiskMap”,您可以在其中放置对象。他们通过弱引用保存你的对象。当您仍在使用给定的对象时,它具有对其的强引用,因此它保留在内存中。当您停止使用它时,该对象将被垃圾收集,并且在此之前,收集会将其序列化到磁盘 (*)。当您再次需要该对象时,您可以像往常一样通过索引或键来请求它,并且集合会反序列化它(或者从其内部缓存中返回它,如果它还没有被GCd)。

(*) 现在看来,这就是症结所在。为了使其工作,我需要能够在该对象被 GCd 之前收到通知 - 在不存在对其的其他引用之后(因此该对象不能再被修改),但在该对象从内存中删除之前。事实证明这很困难。我简单地认为使用 ReferenceQueue 会拯救我,但可惜的是,它返回一个 Reference,其所指对象迄今为止始终为 null。

有没有一种方法,在给定一个任意对象后,在准备好进行垃圾收集之后但在垃圾收集之前接收该对象(通过回调或队列等)?

我知道 (Object).finalize() 基本上可以做到这一点,但我必须处理不属于我的类,以及其 finalize 我无法合法覆盖的方法。我不想像自定义类加载器、字节码操作或反射那样神秘,但如果必须的话我会这样做。

(此外,如果您知道现有的进行透明磁盘缓存的库,我会很看好,尽管我对这样的库的要求相当严格。)

最佳答案

您可以寻找支持“写入缓存”和分层的缓存。著名的产品有 EHCache、Hazelcast、Infinispan。

或者你可以自己构建一些带有缓存和空闲到期时间的东西。 那么,缓存访问将是对象的“使用”。

Is there a way, having been given an arbitrary object, to receive (via callback or queue, etc.) the object after it is ready to be garbage collected, but before it IS garbage collected?

这会严重干扰垃圾收集。它很可能会导致您的应用程序或整个系统瘫痪。您想要做的是在系统内存不足或内存不足时启动磁盘 I/O 并可能分配其他对象。如果你设法让它工作,你最终会使用比以前更多的堆,因为当 GC 启动时堆必须始终扩展。

关于java - 在 Java 对象被垃圾收集之前对其进行回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53001446/

相关文章:

JavaFX 简单更新标签(线程)

java - 如何使用 HashMap 并在 ArrayAdapter 中使用它来在微调器中显示值

Android HttpsURLConnection,如何判断响应是否被缓存?

java - G1 收集器每秒执行 50 次

garbage-collection - 由于 GC,Cassandra 修复失败

java - 如何打印ArrayLists的ArrayList,以便将每个内部列表打印在一行上?

java - 注入(inject)和配置 Gradle 构建

node.js - 在 docker 容器中构建 NodeJS webpack

ServiceStack 的 Azure Redis 缓存始终在增加

AWS Lambda 中的 Python 没有正确垃圾收集?