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

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

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

总结

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索spring
, 垃圾回收
, 创建
类回收
spring 垃圾回收、java 对象垃圾回收、lua 全局对象垃圾回收、杉德卡保证金回收网点、资本回收保证量,以便于您获取更多的相关知识。

时间: 2024-10-31 14:23:37

spring启动后保证创建的对象不被垃圾回收器回收_java的相关文章

① 在对象被垃圾回收器回收的时候,析构函数被GC自动调用 ②当对象即将离开作用域时,系统自动调用对象的的析构函数

问题描述 资料上说:①当对象即将离开作用域时,系统自动调用对象的的析构函数②在对象被垃圾回收器回收的时候,析构函数被GC自动调用-----------------------------------------------所以我就迷惑:当对象即将离开作用域时,即使垃圾回收器没有回收,系统也会自动调用对象的的析构函数吗?还是垃圾回收器与析构函数是"捆绑"在一起的?(即析构函数只有在垃圾回收器回收时才会被调用,其他任何情况析构函数都不会被调用,析构函数被系统调用说明垃圾回收器在执行回收工作

解析Android应用启动后自动创建桌面快捷方式的实现方法

要不怎么说Android特别开放呢,在Android开发中,只要发送一个广播,就可以实现这种需求了. 废话不多说,以下是封装好的一段代码.复制代码 代码如下:public class ShortcutUtil { public static void createShortCut(Activity act, int iconResId,              int appnameResId) { // com.android.launcher.permission.INSTALL_SHOR

virtualbox创建COM对象失败

问题描述 virtualbox创建COM对象失败 启动virtualbox是创建com对象失败,在兼容性俩面设置了server 2008可以正常启动,但是运行虚拟机又出现创建com对象失败 解决方案 有两个可能,一个是兼容性问题http://jingyan.baidu.com/article/67508eb4d82eeb9cca1ce426.html 一个是没有注册vboxc.dllhttp://blog.sina.com.cn/s/blog_787e8f6501017aj9.html 解决方案

spring对象-spring让一个对象的创建不用new了

问题描述 spring让一个对象的创建不用new了 是什么对象不用new了.aop有是什么东西.网上说的不容易理解.希望大神能给通俗的讲讲.谢谢. 解决方案 IOC(DI)简单地说就是,调用类对某一接口实现类的依赖关系又第三方(容器或者协作类)注入.举个例子 控制即是对于接口B的控制权 反转即是这种控制权从A上移除,转交到D里 调用类A对接口B的实现类C的依赖由第三方D类来提供. 这个解释够浅显了吧!!! 解决方案二: C++用new和不用new创建类对象C++用new和不用new创建类对象区别

android模拟器-android studio创建的模拟器启动后,为什么只有一半

问题描述 android studio创建的模拟器启动后,为什么只有一半 我用android studio创建了一个模拟器,启动后只显示一半,同时报以下内容: Note: The environment variable $ANDROID_SDK_HOME is set, and the emulator uses that variable to locate AVDs. This may result in the emulator failing to start if it cannot

【解决】virtualbox启动报创建COM对象失败错误

今天在启动virtualbox时,发现virtualbox报创建COM对象失败错误,如下图: 查找相关资料发现很有可能是virtualbox与OS不兼容造成. 调整virtualbox的兼容性,如下图: 然后再启动virtualbox,就可以了.

spring启动component-scan类扫描加载过程---源码分析

最近因为写书的事情,一段时间没有写博客了,有朋友最近问到了spring加载类的过程,尤其是基于annotation注解的加载过程,有些时候如果由于某些系统部署的问题,加载不到,很是不解!就针对这个问题,我这篇博客说说spring启动过程,用源码来说明,这部分内容也会在书中出现,只是表达方式会稍微有些区别,我将使用spring 3.0的版本来说明(虽然版本有所区别,但是变化并不是特别大),另外,这里会从WEB中使用spring开始,中途会穿插自己通过new ClassPathXmlApplicat

使用Spring Boot和Gradle创建AngularJS项目

Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置. 本文主要是记录使用 Spring Boot 和 Gradle 创建项目的过程,其中会包括 Spring Boot 的安装及使用方法,希望通过这篇文章能够快速搭建一个项目. 1. 开发环境 操作系统: mac JDK:1.7.0_60 Gradle:2.2.1 IDE:Idea 2. 创建项目

浅析Java中对象的创建与对象的数据类型转换_java

Java:对象创建和初始化过程 1.Java中的数据类型    Java中有3个数据类型:基本数据类型(在Java中,boolean.byte.short.int.long.char.float.double这八种是基本数据类型).引用类型和null类型.其中,引用类型包括类类型(含数组).接口类型.     下列语句声明了一些变量: int k ; A a; //a是A数据类型的对象变量名. B b1,b2,-,b10000;// 假定B是抽象类或接口. String s;      注意:从