【强,软,弱,虚】
在JVM的运行中还存有其他的引用类型。在JAVA中四种不同的引用类型
强引用
- 对于强引用对象,就算是出现了OOM也不会对该对象进行回收
- 强引用是我们最常见的普通对象引用,只要还是强引用指向一个对象,就表明这个对象还活着,垃圾收集器不会碰这种对象
软引用
- 软引用是一种相对强引用弱化了一些的引用,需要java.lang.ref.SoftReference类来实现
- 当系统内存充足的时候,不会被回收;
- 当系统内存不足时,才会被回收
- 比如:高速缓存就可以用到软引用,内存够时就保留,不够时就被回收
弱引用
- 弱引用需要用到java.lang.ref.WeakReference类来实现,它比软引用的生存周期更短。对于只有弱引用的对象来说,只要有垃圾回收,不管JVM的内存空间够不够用,都会回收该对象占用的内存空间
虚引用
- 虚引用需要java.lang.ref.Phantomreference类来实现,虚引用的作用主要似乎跟踪对象被垃圾回收的状态
- 设置虚引用关联的唯一目的,就是在这个对象被回收的时候收到一个系统通知或者是后续添加进一步的操作处理
什么样的对象是垃圾
- 引用计数法
- 顾名思义,只要JVM中该对象被别人所引用(持有该对象的引用),就说明该对象不是垃圾,如果一个对象在JVM中没有任何指针对其引用,它就是垃圾
- 可达性分析
- 通过GC ROOT的对象,开始向下寻找,看某个对象是否可达,不可达的对象就是内存垃圾,通过这种方式可以规避引用计数法存在的相互指向的问题,也是目前垃圾回收器默认的垃圾分析标记算法。
JAVA中那些对象能做成时GC ROOT
- 虚拟机栈(栈帧中的本地变量表)中引用的对象。
- 本地方法栈中的对象。
- 类静态属性引用的对象
- 方法区中常量引用的对象
- 存活的Thread对象
- Bootstrap ClassLoader
- 通过 boot cl 或ext cl 加载Class对象
- 正在被synchronized锁定的对象
比你努力的人还在努力,你拿什么理由不努力呢-------->自己