Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于Springbean容器中的范围和垃圾收集_Java_Spring_Garbage Collection - Fatal编程技术网

Java 关于Springbean容器中的范围和垃圾收集

Java 关于Springbean容器中的范围和垃圾收集,java,spring,garbage-collection,Java,Spring,Garbage Collection,我是Spring的新手,目前正在我的一个项目中使用它。我了解到Spring容器包含所有bean,默认情况下,所有bean的作用域都是“singleton”。我可以在应用程序上下文.xml文件中或使用注释@scope更改范围。 我进一步了解到,如果一个类具有范围“prototype”,Spring容器将在需要时实例化这个类的新对象 我不明白的是:垃圾收集是如何处理的。如果不再需要创建的对象,是否会对其进行垃圾收集,或者是否仍将其保留在容器中。显然,我不希望为了保持低内存使用率而创建和保留许多对象。

我是Spring的新手,目前正在我的一个项目中使用它。我了解到Spring容器包含所有bean,默认情况下,所有bean的作用域都是
“singleton”
。我可以在
应用程序上下文.xml
文件中或使用注释
@scope
更改范围。 我进一步了解到,如果一个类具有范围
“prototype”
,Spring容器将在需要时实例化这个类的新对象


我不明白的是:垃圾收集是如何处理的。如果不再需要创建的对象,是否会对其进行垃圾收集,或者是否仍将其保留在容器中。显然,我不希望为了保持低内存使用率而创建和保留许多对象。

容器不保留对实例化bean的引用,而使用它们的代码却保留引用

如果没有其他东西引用bean(大致上),那么它符合GC的条件。

来自Spring文档():

与其他作用域不同,Spring不管理原型bean的整个生命周期:容器实例化、配置和以其他方式组装原型对象,并将其交给客户机,没有该原型实例的进一步记录

简单地说,一旦创建并获得对
prototype
作用域bean的引用,它就是JVM中唯一存在的引用。一旦此引用超出范围,对象将被垃圾收集:

void bar() {
  Object foo = ctx.getBean("foo")
}
当您离开
bar()
方法时,没有任何其他引用指向
foo
的新实例,这意味着它符合垃圾收集的条件。该模型的结果是:

因此,尽管对所有对象调用初始化生命周期回调方法,而不考虑范围,但对于原型,不会调用配置的销毁生命周期回调


非常感谢您的快速回复。我正在努力理解这一点。那么它是否使@PreDestroy与原型bean无关?