美文网首页
Java四种引用(强软弱虚)

Java四种引用(强软弱虚)

作者: lenny611 | 来源:发表于2020-11-08 22:30 被阅读0次

强引用: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来进行回收。

相关文章

  • JAVA四种引用(强引用,弱引用,软引用,虚引用)

    JAVA四种引用(强引用,弱引用,软引用,虚引用) [toc] 参考:Java 的强引用、弱引用、软引用、虚引用四...

  • java四种引用类型

    java中得四种引用 Java中有四种引用类型:强引用、软引用、弱引用、虚引用 强引用我们代码中常写,如: Obj...

  • Java的四种对象引用类型

    Java的四种对象引用类型:强引用、弱引用、软引用、虚引用。 强引用(StrongReference): 强引用是...

  • Android面试Java基础篇(四)

    问:Java中四种引用类型 答:四种引用类型分别为 强引用、弱引用、软引用、虚引用 强引用(StrongRefer...

  • java四种引用强软弱虚

    强引用:最常见的,不会被GC回收的对象,如 Object obj = new Object(); 软引用:可有可无...

  • Java四种引用(强软弱虚)

    强引用:new出来的都是强引用,JVM垃圾回收的时候宁可发生OOM(OutOfMemory),也不会回收持有强引用...

  • Java中的四种引用类型

    一、Java中的四种引用类型 JDK 1.2 开始 Java 提供了四种引用类型,分别是强引用、软引用、弱引用、虚...

  • Java引用复习

    前言 Java引用是java的基础知识点,主要分为四种,强引用,软引用,弱引用,虚引用。 一、强引用 强引用是指对...

  • Java强软弱虚引用

    在JDK1.2以前的版本中,当一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及...

  • ThreadLocal内存泄漏问题

    java对象的四种引用方式 对象的引用方式分:强、软、弱、虚四种 强引用 普通的写法即强引用 当GC回收时,拥有强...

网友评论

      本文标题:Java四种引用(强软弱虚)

      本文链接:https://www.haomeiwen.com/subject/zedhbktx.html