面试准备-Java基础

Java中对象引用类型分哪几类?

引用类型 被垃圾回收时间 用途 生存时间
强引用 从来不会 对象的一般状态 JVM停止运行时终止
软引用 当内存不足时 对象缓存 内存不足时终止
弱引用 正常垃圾回收时 对象缓存 垃圾回收后终止
虚引用 正常垃圾回收时 跟踪对象的垃圾回收 垃圾回收后终止

1.强引用

  • 1.1普通变量赋值即为强引用,如`A a = new A(); 适用与成员变量、静态变量、局部变量;注意:如果直接把一个字符串直接赋值给String类型变量,那么它就会在常量池中保存,就会有一个额外的强引用,所以在使用软引用、弱引用、虚引用的时候,如果需要引用的是字符串对象,千万不要直接将一个字符串传入,而是要传入一个new String对象,否则就会产生一个额外的强引用,注意弱引用介绍完下边的代码演示
  • 1.2通过GC Root的引用链,如果强引用不到该对象,该对象才能被回收
  • 1.3当内存空间不足时,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题
  • 1.4如果想中断强引用和某个对象之间的关联,可以显示地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象
  • 1.5比如ArraryList类的clear方法中就是通过将引用赋值为null来实现清理工作的
  • 1.6在ArrayList类中定义了一个私有的变量elementData数组,在调用方法清空数组时可以看到为每个数组内容赋值为null不同于elementData=null,(由于Object[] elementData,即elementData变量是在栈中分配的空间,但是elementData数组是在堆中分配的内存空间,数组的每一位都指向一个Object对象,每个Object对象是在堆中分配的内存空间,如果将elementData=null,栈中变量指向null,也就是说对数组取消了强引用,但是elementData数组中的每一位依然对他们指向的Object对象存在强引用)这样强引用仍然存在,这些Object对象并没有被释放;但是采用给数组的每一位赋值为null,可以取消数组的每一位对他们指向的Object对象的强引用;同时避免在后续调用 add()等方法添加元素时进行重新的内存分配。使用如clear()方法中释放内存的方法对数组中存放的引用类型特别适用,这样就可以及时释放内存。
public void clear() {
   
      modCount++;
 
      // Let gc do its work
      for (int i = 0; i < size; i++)
          elementData[i] = null;
 
      size = 0;
}
GC Root对象
a对象

2.软引用(SoftReference)

  • 2.1 例如:
SoftReference softReference = new SoftReference(new A());
SoftReference<A> softReference1 = new SoftReference<>(new A());
  • 2.2如果仅有软引用该对象时,首次垃圾回收不会回收该对象,如果内存仍然不足,再次回收时才会释放对象, 但是仅仅只会回收软引用指向的对象的内存,软引用自身不会被回收,如果二次回收完成之后,系统内存依然不够,才会抛出内存溢出错误
  • 2.3在回收这些对象之前,我们可以通过:MyObject anotherRef=(MyObject)aSoftRef.get(); 重新获得对该实例的强引用;而回收之后,调用get()方法就只能得到null了。
  • 2.3软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中
  • 2.4软引用自身需要配合引用队列来释放
  • 2.5虚拟机会尽可能优先回收长时间闲置不用的软引用对象。对那些刚构建的或刚使用过的“较新的”软对象会被虚拟机尽可能保留,这就是引入引用队列ReferenceQueue的原因
  • 2.6软引用主要用户实现类似缓存的功能,在内存足够的情况下直接通过软引用取值,无需从繁忙的真实来源查询数据,提升速度;当内存不足时,自动删除这部分缓存数据,从真正的来源查询这些数据
  • 2.7典型的例子反射数据,反射获取的对象都是软引用的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值