在看jdk动态代理源码,发现进行了缓存,但是缓存都是用WeakReference包装起来的
我想直接放在其中不行吗,这么大费周折的引入弱引用的原因是什么呢?
在看jdk动态代理源码,发现进行了缓存,但是缓存都是用WeakReference包装起来的
我想直接放在其中不行吗,这么大费周折的引入弱引用的原因是什么呢?
3 回答2.6k 阅读✓ 已解决
3 回答4.1k 阅读✓ 已解决
8 回答3.6k 阅读
4 回答2.8k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.5k 阅读✓ 已解决
3 回答1.7k 阅读✓ 已解决
没有研究过其源码,单从问题分析,WeakReference的作用
以上引用自WeakReference文档https://docs.oracle.com/javas...
其中提到弱引用通常用来做规范映射,并且弱引用引用的对象在进行内存可达性分析的时候会更容易被标记为可回收。粗略看了一下动态代理类的源码,发现里面用了静态类与静态方法,那么是否应该考虑动态代理的Cache是被静态类和静态方法所引用(static修饰的内容往往在可达性分析时被看做GC Root)
第一类被列为GC Root的元素就是静态成员变量。
因此若缓存不再需要时,使用强引用会让GC进行标记分析时认为从GC Root可达,不太会去标记这块内存,反之能够有效地标记这些缓存,从而提高内存回收效率
以上是我个人的理解,也许比较肤浅