5

GC 疑难情况问题排查与分析(下篇)

 3 years ago
source link: https://kimmking.blog.csdn.net/article/details/108728950
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Weak、Soft 及 Phantom 引用

另一类影响 GC 的问题是程序中的 non-strong 引用。虽然这类引用在很多情况下可以避免出现 OutOfMemoryError,但过量使用也会对 GC 造成严重的影响,反而降低系统性能。

弱引用的缺点

首先,弱引用(weak reference)是可以被 GC 强制回收的。当垃圾收集器发现一个弱可达对象(weakly reachable,即指向该对象的引用只剩下弱引用)时,就会将其置入相应的 ReferenceQueue 中,变成可终结的对象。之后可能会遍历这个 reference queue,并执行相应的清理。典型的示例是清除缓存中不再引用的 KEY。

当然,在这个时候我们还可以将该对象赋值给新的强引用,在最后终结和回收前,GC 会再次确认该对象是否可以安全回收。因此,弱引用对象的回收过程是横跨多个 GC 周期的。

实际上弱引用使用的很多。大部分缓存框架都是基于弱引用实现的,所以虽然业务代码中没有直接使用弱引用,但程序中依然会大量存在。

其次,软引用(soft reference)比弱引用更难被垃圾收集器回收。回收软引用没有确切的时间点,由 JVM 自己决定。一般只会在即将耗尽可用内存时,才会回收软引用,以作最后手段。这意味着可能会有更频繁的 Full GC,暂停时间也比预期更长,因为老年代中的存活对象会很多。

最后,使用虚引用(phantom reference)时,必须手动进行内存管理,以标识这些对象是否可以安全地回收。表面上看起来很正常,


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK