欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

spring启动后保证创建的对象不被垃圾回收器回收

程序员文章站 2024-03-13 11:26:57
一、可达性分析(根搜索)算法 jvm通过可达性分析来判定对象是否存活。这个算法的基本思路就是通过一系列称为gc roots的对象作为起始点,从这些节点开始向下搜索,搜索所...

一、可达性分析(根搜索)算法

jvm通过可达性分析来判定对象是否存活。这个算法的基本思路就是通过一系列称为gc roots的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到gc roots没有任何引用链相连时,则证明此对象是不可用的。如下图中对象object1object2object3object4是可用的对象,object5object6object7虽然互相关联,但是它们到gc roots是不可达的,所以它们将会被判定为是可回收的对象。

spring启动后保证创建的对象不被垃圾回收器回收

在java语言中,可作为gc roots的对象包括下面几种:

     1、虚拟机栈(栈帧中的本地变量)中引用的对象。

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

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

     4、本地方法栈中jni(native方法)引用的对象。

二、spring源代码

spring创建对象是通过实现接口beanfactory的类来实现的,有如下的实现结构:

spring启动后保证创建的对象不被垃圾回收器回收

simplejndibeanfactory.java

public class simplejndibeanfactory extends jndilocatorsupport implements beanfactory {
  private final set<string> shareableresources = new hashset();
  //使用new创建的map,是栈中引用的对象,可作为gc roots 对象
  private final map<string, object> singletonobjects = new hashmap();
  private final map<string, class<?>> resourcetypes = new hashmap();
  public simplejndibeanfactory() {
    this.setresourceref(true);
  }
  public void addshareableresource(string shareableresource) {
    this.shareableresources.add(shareableresource);
  }
  public void setshareableresources(string... shareableresources) {
    this.shareableresources.addall(arrays.aslist(shareableresources));
  }
  public object getbean(string name) throws beansexception {
    return this.getbean(name, object.class);
  }
}

staticlistablebeanfactory.java

public class staticlistablebeanfactory implements listablebeanfactory {
  private final map<string, object> beans;
  public staticlistablebeanfactory() {
    //使用new创建的map,是栈中引用的对象,可作为gc roots 对象
    this.beans = new linkedhashmap();
  }
  public staticlistablebeanfactory(map<string, object> beans) {
    assert.notnull(beans, "beans map must not be null");
    this.beans = beans;
  }
  public void addbean(string name, object bean) {
    this.beans.put(name, bean);
  }
}

从上面的源代码可以看出,对象存放在一个map中,其中mapsingletonobjects是用来存放单例对象的。map singletonobjectsbeans(在构造方法中new)都是直接使用关键字new创建,是强引用,满足作为gc roots对象的条件(虚拟机栈(栈帧中的本地变量)中引用的对象)。这样创建的对象存在map中和gc roots对象相连,所以不会被回收。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。