当前位置: 移动技术网 > IT编程>开发语言>Java > spring启动后保证创建的对象不被垃圾回收器回收

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

2019年07月22日  | 移动技术网IT编程  | 我要评论

超时空救兵高清,王子轩结婚,宠物六少

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

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

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

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

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

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

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

二、spring源代码

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

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对象相连,所以不会被回收。

总结

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网