详解JAVA 强引用

 更新时间:2020年08月17日 15:43:15   作者:弗兰克的猫  
这篇文章主要介绍了JAVA 强引用的相关资料,帮助大家更好的理解和学习,感兴趣的朋友可以了解下

定义

强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器宁愿抛出OOM(OutOfMemoryError)也不会回收它。

说明

不要被这个强字吓到,以为这个引用就很厉害,其实强引用就是程序中使用的一般引用类型。举个简单的栗子:

String s = new String("Hello Frank!");

 强可达
如果一个对象与GC Roots之间存在强引用,则称这个对象为强可达(strong reachable)对象。

当你声明一个变量并指向一个实例的时候,其实就是在创造一个强引用。那么,既然叫强引用,它“强”在哪里呢?

这主要体现在JVM进行GC的时候,只要对象有强引用与其关联,就绝对不会对它进行回收,即使已经内存不足了也不会收回有强引用指向的对象。

如果你不需要使用某个对象了,可以将相应的引用设置为null,消除强引用来帮助垃圾回收器进行回收。因为过多的强引用也是导致OOM的罪魁祸首。

s = null;

显式地设置消除引用,或已超出对象的生命周期范围,则JVM会认为该对象不存在引用,这时就可能会回收这个对象。但是具体什么时候收集这要取决于具体的GC算法。

如果在一个方法的内部有一个变量s持有一个对象(Object)的强引用,那么这个变量s保存在栈中,而真正的引用内容(object)保存在堆中。当这个方法运行完成后就会退出方法栈,则引用s也会被销毁,这个object就会被回收。但是当这个s是全局变量时,就需要在不再使用这个对象时赋值为null,因为有强引用关联的对象是不会被垃圾回收的。

A a = new A();
B b = new B(a);
a = null;

这里a和b是强引用,当把 a = null 时,这时 a 不再指向 A 的地址。讲道理:当某个对象不再与其他引用关联时,就会被 垃圾回收器判定为可回收,在GC中就会被回收掉。但是这里a = null 时,A 对象不能被回收,因为还有一个B对象持有其强引用,这时候就造成了内存泄漏。

再看另一个会导致内存泄漏的栗子:

public static ArrayList<Object> list = new ArrayList<Object>();
public void stackOverflowTest(Object object){
  list.add(object);
  object = null;
}

GC回收的是不可达、弱可达或者虚可达对象,但是,在这个静态集合类对象中,持有了对象的强引用,但是却有可能对象已经不再使用了,所以当非静态对象被静态变量持有强引用的时候,最容易发生内存泄露,在方法中从list获取到对象后赋值给一个变量,使用完之后将这个变量设置为null并不会释放object引用的对象,因为list中还是持有对象的强引用。这时就造成了内存泄漏。

小结

所以小结一下强引用的特点:

  • 强引用就是最普通的引用
  • 可以使用强引用直接访问目标对象
  • 强引用指向的对象在任何时候都不会被系统回收
  • 强引用可能会导致内存泄漏
  • 过多的强引用会导致OOM

以上就是详解JAVA 强引用的详细内容,更多关于JAVA 强引用的资料请关注脚本之家其它相关文章!

相关文章

  • 使用JMX连接JVM实现过程详解

    使用JMX连接JVM实现过程详解

    这篇文章主要介绍了使用JMX连接JVM实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • @AutoConfigurationPackage与@ComponentScan注解区别

    @AutoConfigurationPackage与@ComponentScan注解区别

    这篇文章主要介绍了@AutoConfigurationPackage与@ComponentScan注解区别,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • Java中的CopyOnWriteArrayList解析

    Java中的CopyOnWriteArrayList解析

    这篇文章主要介绍了Java中的CopyOnWriteArrayList解析,ArrayList是非线程安全的,也就是说在多个线程下进行读写,会出现异常,既然是非线程安全,那我们就使用一些机制把它变安全不就好了,需要的朋友可以参考下
    2023-12-12
  • SpringBoot如何切换成其它的嵌入式Servlet容器(Jetty和Undertow)

    SpringBoot如何切换成其它的嵌入式Servlet容器(Jetty和Undertow)

    这篇文章主要介绍了SpringBoot如何切换成其它的嵌入式Servlet容器(Jetty和Undertow),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Java局部变量线程安全原理分析

    Java局部变量线程安全原理分析

    这篇文章主要介绍了Java局部变量线程安全原理分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 通过反射注解批量插入数据到DB的实现方法

    通过反射注解批量插入数据到DB的实现方法

    今天小编就为大家分享一篇关于通过反射注解批量插入数据到DB的实现方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Java高级面试题小结

    Java高级面试题小结

    本文主要介绍了一些在Java面试过程中的一些高级面试题,包括对部分名词的释义及代码解析,具有一定收藏价值,需要的朋友可以参考下
    2017-09-09
  • SpringCloud Alibaba Nacos 整合SpringBoot Admin实战

    SpringCloud Alibaba Nacos 整合SpringBoot A

    这篇文章主要介绍了SpringCloud Alibaba Nacos 整合SpringBoot Admin实战,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • SpringBoot通过AOP与注解实现入参校验详情

    SpringBoot通过AOP与注解实现入参校验详情

    这篇文章主要介绍了SpringBoot通过AOP与注解实现入参校验详情,文章从相关问题展开全文内容详情,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-05-05
  • 解决SpringBoot打成jar运行后无法读取resources里的文件问题

    解决SpringBoot打成jar运行后无法读取resources里的文件问题

    这篇文章主要介绍了解决SpringBoot打成jar运行后无法读取resources里的文件问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08

最新评论