主页 > 知识库 > Spring管理单例对象的时候,如何实现不被JVM回收的?

Spring管理单例对象的时候,如何实现不被JVM回收的?

热门标签:潜江电销 梧州电销 平凉电销 三亚电销 黑龙江电销 天津电销 安顺电销 廊坊电销

一、对象会不会回收跟该对象的生命周期有很大关系:

singletonObjects从属于ApplicationContext,只要ApplicationContext不被回收,singletonObjects就不会被回收。 而ApplicationContext,就有多种情况了

① 你手动创建,例如在main方法中,那么生存周期根据你的代码而定。

② 整合到Servlet中,那么应用服务器持有ApplicationContext引用,服务器不关闭则引用不失效。

③ SpringBoot类似于①或②

二、JVM虚拟机的垃圾收集算法使用根搜索算法

这个算法的基本思路是:对任何“活”的对象,一定能最终追溯到其存活在堆栈或静态存储区之中的引用。通过一系列名为根(GC Roots)的引用作为起点,从这些根开始搜索,经过一系列的路径,如果可以到达java堆中的对象,那么这个对象就是“活”的,是不可回收的。可以作为根的对象有:

虚拟机栈(栈桢中的本地变量表)中的引用的对象。

方法区中的类静态属性引用的对象。

方法区中的常量引用的对象。

本地方法栈中JNI的引用的对象。

方法区是jvm的一块内存区域,用来存放类相关的信息。很明显,java中单例模式创建的对象被自己类中的静态属性所引用,符合第二条,因此,单例对象不会被jvm垃圾收集。

虽然jvm堆中的单例对象不会被垃圾收集,但是单例类本身如果长时间不用会不会被收集呢?因为jvm对方法区也是有垃圾收集机制的。如果单例类被收集,那么堆中的对象就会失去到根的路径,必然会被垃圾收集掉。对此源码,笔者查阅了hotspot虚拟机对方法区的垃圾收集方法,jvm卸载类的判定条件如下:

只有三个条件都满足,jvm才会在垃圾收集的时候卸载类。显然,单例的类不满足条件一,因此单例类也不会被卸载。也就是说,只要单例类中的静态引用指向jvm堆中的单例对象,那么单例类和单例对象都不会被垃圾收集,依据根搜索算法,对象是否会被垃圾收集与未被使用时间长短无关,仅仅在于这个对象是不是“活”的。

【无情怀,不编码。做一个有情怀的码农,虽千万人,吾往矣!】 关注java自学、java技术、求职领域,为你导航领路,指点迷津,分享学习感受和技能经验。欢迎点赞、转发、关注和留言源码,任何java学习或求职面试问题可以留言私信,有问必答。

标签:桂林 怀化 洛阳 宜宾 广安 海口 连云港 通化

巨人网络通讯声明:本文标题《Spring管理单例对象的时候,如何实现不被JVM回收的?》,本文关键词  ;如发现本文内容存在版权问题,烦请提供相关信息告之我们,我们将及时沟通与处理。本站内容系统采集于网络,涉及言论、版权与本站无关。
  • 相关文章
  • 下面列出与本文章《Spring管理单例对象的时候,如何实现不被JVM回收的?》相关的同类信息!
  • 本页收集关于Spring管理单例对象的时候,如何实现不被JVM回收的?的相关信息资讯供网民参考!
  • 收缩
    • 微信客服
    • 微信二维码
    • 电话咨询

    • 400-1100-266