Java四种引用(强软弱虚)

2020-11-08  本文已影响0人  lenny611

强引用:new出来的都是强引用,JVM垃圾回收的时候宁可发生OOM(OutOfMemory),也不会回收持有强引用的对象。
强引用例子如下:
如下图,设置堆大小为10M,代码分配时分配15M


参数设置及结果图

软引用:softReference,JVM只有在内存不足的时候才会清理这一部分引用。一般用作缓存。
根据下图可以看到,设置堆内存大小为20M,刚开始分配了10M的软引用空间,后面又分配了12M的空间,按道理来说已经超过最大堆的上限了,为什么没有OOM,这是因为10M的软引用空间在内存不足的情况下已经被回收了。


参数设置及结果图
可以验证下当内存足够时软引用是否会被回收,代码如下:
内存充足的情况下软引用不会被回收
弱引用:
weakReference,JVM在GC的时候就会清理这一部分引用。与ThreadLocal搭配使用。

如下图所示,可以看到弱引用在GC执行之后就被清理了,同时,ThreadLocal是线程私有的,互不影响,可以看到两个线程取到的值不是同一个。


弱引用示意图
ThreadLocal的set方法具体如下:
ThreadLoca的set方法实现
由上图可以看到set方法实际调用的是ThreadLocalMap的set方法,继续往下看
ThreadLocalMap的set方法实现
由ThreadLocalMap的set方法实现可以看到,set实际上是set一个Entry,而Entry的具体实现如下:
Entry的具体实现
可以看到,Entry是弱引用的子类,也就是说当GC执行的时候,ThreadLocal的静态内部类ThreadLocalMap的所有key会被置为null,随之带来的结果就是map里面的value没办法访问到,如果不清除的话会产生内存泄漏的问题,因此在使用到ThreadLocal时,如果已经明确不需要了,就应该执行 threadLocal的remove()方法,防止内存泄漏。
虚引用:phantomReference,一般用得很少,与直接内存(也叫堆外内存)搭配使用。
GC主要针对的是堆,而堆外内存的垃圾回收,则是由JVM来进行回收。
上一篇下一篇

猜你喜欢

热点阅读