为什么jdk动态代理类的缓存是弱引用

在看jdk动态代理源码,发现进行了缓存,但是缓存都是用WeakReference包装起来的
我想直接放在其中不行吗,这么大费周折的引入弱引用的原因是什么呢?

阅读 2.5k
1 个回答

没有研究过其源码,单从问题分析,WeakReference的作用

Weak reference objects, which do not prevent their referents from being made finalizable, finalized, and then reclaimed. Weak references are most often used to implement canonicalizing mappings.
Suppose that the garbage collector determines at a certain point in time that an object is weakly reachable. At that time it will atomically clear all weak references to that object and all weak references to any other weakly-reachable objects from which that object is reachable through a chain of strong and soft references. At the same time it will declare all of the formerly weakly-reachable objects to be finalizable. At the same time or at some later time it will enqueue those newly-cleared weak references that are registered with reference queues.

以上引用自WeakReference文档https://docs.oracle.com/javas...

其中提到弱引用通常用来做规范映射,并且弱引用引用的对象在进行内存可达性分析的时候会更容易被标记为可回收。粗略看了一下动态代理类的源码,发现里面用了静态类与静态方法,那么是否应该考虑动态代理的Cache是被静态类和静态方法所引用(static修饰的内容往往在可达性分析时被看做GC Root)

可以作为root的对象:

  1.类中的静态变量,当它持有一个指向一个对象的引用时,它就作为root

第一类被列为GC Root的元素就是静态成员变量。

因此若缓存不再需要时,使用强引用会让GC进行标记分析时认为从GC Root可达,不太会去标记这块内存,反之能够有效地标记这些缓存,从而提高内存回收效率

以上是我个人的理解,也许比较肤浅

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏