java - 弱引用和软引用

标签 java weak-references soft-references

弱引用允许GC在下一个GC周期中收集引用,而软引用将保留引用直到内存已满,并且在抛出内存不足错误之前,它将删除软引用。 我们将在哪里使用这些引用文献? 哪个引用最适合实现缓存? 例如:如果我使用软引用进行缓存,那么当内存满时它将被清除。 但是让我们假设,我已经获取了一些数据库详细信息并将其放入内存中并将该详细信息缓存在软引用中,现在如果我从内存中删除了一些键值,它仍然会存在于缓存中。我们是否需要在此使用弱引用情况如何?应该如何做出决定。

最佳答案

大多数情况下,软引用用于缓存。您希望尽可能长时间地将数据保留在 RAM 中,但清除缓存总比因 OOM 而死掉要好。

例如,可以使用弱引用来保留有关您的类(class)的额外信息。您有类 User 并且您想要存储一些附加信息,这些信息应该在删除用户时删除(您不想手动执行此操作,因为它是样板代码)。因此,您使用 WeakHashMap 并使用 User 作为键,并且当没有对 user 的引用时,它也会从该映射中删除。

顺便说一下:在引用计数的语言中,弱引用是用来防止引用循环的,但是java GC消除了“隔离岛”,所以弱引用的这种用法不适用于java。

关于java - 弱引用和软引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32443746/

相关文章:

swift 警告 : 'weak' should not be applied to a property declaration in a protocol

java - WeakReference 字符串没有被垃圾回收?如何?

Java:强/软/弱/幻引用之间的区别

java - 如何呈现对象数组,就像另一个对象数组一样

python - 为什么 class.__weakref__ 不是 None,而 instance.__weakref__ 是 None?

java - Java 中软引用的用例是什么?

python - 有什么方法可以使用 Numpy 数组创建软引用或类似指针的对象吗?

java - Java中关于线程中的同步和监控

java静态内部类初始化错误

java - 如何编写一个简单的java程序来将一系列时间转换为单个单位? (例如以毫秒为单位)