背景故事:所以我有这个好主意,对吗?有时您正在收集大量数据,并且不需要一直访问所有数据,但在程序完成后您也可能不需要它,并且您真的不想浪费时间如果您有一个库,可以在您不使用对象时自动将对象静默序列化到磁盘,并在需要时静默将它们带回磁盘,该怎么办?所以我开始写一个库;它有许多集合,例如“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/