符号引用和直接引用、强引用、软引用、弱引用、虚引用

符号引用和直接引用、强引用、软引用、弱引用、虚引用

符号引用

  • 以一组符号来描述所引用的目标。
  • 符号引用可以是任何形式的字面量,只要使用时能无歧义地定位到目标即可,符号引用和虚拟机的布局无关。
  • 为什么要有符号引用?

java 类被编译成 class 文件时,虚拟机并不知道所引用类的地址,所以就用符号引用来代替 ,而在链接的解析阶段 就是为了把这个符号引用转化成为真正的地址即直接引用

直接引用

  • 直接引用和虚拟机的布局是相关的,不同的虚拟机对于相同的符号引用所翻译出来的直接引用一般是不同的
  • 直接引用可以是指向对象,类变量和类方法的指针、相对偏移量、一个间接定位到对象的句柄。

强引用

把一个对象赋给一个引用变量,如 MikeChen mikechen=new MikeChen();

在一个方法的内部有一个强引用,这个引用保存在 Java 栈中,而真正的引用内容(MikeChen)保存在 Java 堆中。

如果一个对象具有强引用,即使 OOM 垃圾回收器不会回收该对象,如果强引用对象不使用时,需要弱化从而使 GC 能够回收,如 mikechen=null;

软引用(Soft)

1
2
3
软引用是一种相对强引用弱化了一些的引用,需要用java.lang.ref.SoftReference 类来实现:
String str=new String("abc"); // 强引用
SoftReference<String> softRef=new SoftReference<String>(str);

内存不足时就会回收该对象内存,gc 不一定回收

弱引用(Weak)

不管内存是否足够,只要发生 GC,都会被回收。

调用 System.gc()方法只是起通知作用,不一定立刻 gc,JVM 的 gc 时机由 JVM 自己的状态决定。

比如 ThreadLocal 的静态内部类 Entry 就继承了弱引用,ThreadLocalMap 使用 ThreadLocal 的弱引用作为 key,GC 时这个 ThreadLocal 势必会被回收,这样一来,ThreadLocalMap 中就会出现 key 为 null 的 Entry,就没有办法访问这些 key 为 null 的 Entry 的 value,也就造成内存泄漏。

虚引用(Phantom)

虚引用(Phantom Reference)是 Java 中最弱的引用类型,无法通过引用直接获取到对象实例 。虚引用主要用于跟踪对象被垃圾回收的状态。当一个对象只被虚引用关联时,其实际上并不影响对象的生命周期,也就是说,垃圾回收器随时可能回收被虚引用关联的对象。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计