【问题标题】:need understanding soft/weak/phantom refrence需要了解软/弱/幻影参考
【发布时间】:2015-09-29 14:02:19
【问题描述】:

为什么需要软/弱/幻像引用而不是使对象为空。 我不清楚为什么我们需要使用这些参考资料。

据我了解,内部对象可能为空,但外部对象是可访问的,那么内部对象不会被垃圾收集,要收集内部对象,我们需要使用软/弱/幻像引用。这是正确的还是我们有其他理由使用它?

我在现代 JVM 处理此内部对象后的堆栈溢出后读到其中一个为空,然后被垃圾收集,我无法找到有关此的更多详细信息。

提前致谢。

【问题讨论】:

    标签: java jvm


    【解决方案1】:

    WeakHashMap 这样的数据结构在键上使用WeakReference

    基本上这个想法是,如果在您的代码中有对某个键的引用,则与该键对应的值将保存在 Map 中。

    如果您的代码中没有更多对该键的引用,则关联的值可能是垃圾收集器的候选对象。

    来自java doc

    Map 接口的基于哈希表的实现,带有弱键。 WeakHashMap 中的条目在其键不再常用时将被自动删除。更准确地说,给定键的映射的存在不会阻止该键被垃圾收集器丢弃,也就是说,使其可终结,最终确定,然后回收。当一个键被丢弃时,它的条目实际上从映射中删除,所以这个类的行为与其他映射实现有些不同。

    如果没有WeakReference,则无法获得此行为

    【讨论】:

    • WeakHashMap 我很清楚,在需要时用于软/弱/幻像引用的对象呢?只有为了清除我们需要使用这些引用的内部对象?
    • 请注意,“在您的代码中”应理解为任何活动线程都可以访问(作为堆栈变量、静态或 ThreadLocal)
    • 你的代码意味着不在WeakHashMap代码中。 WeakHashMap 的用户编写的任何代码。
    • 软参考 - 缓存中的应用程序。为什么?让我们说 JVM 内存不足,那么它需要快速的方法来从程序设计者认为并不真正需要/关键的区域释放内存,而不是在内存不足异常时着陆,然后可以使用软引用向 JVM 声明,当内存是您分配另一个强引用对象的优先级时,您可以释放它们。对于弱引用和虚引用,我在上面给出的链接涵盖了您需要的所有内容。
    猜你喜欢
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 2021-05-07
    相关资源
    最近更新 更多