gpt4 book ai didi

java - 从内存中清理 Spring Prototype-beans 澄清情况

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:31:31 26 4
gpt4 key购买 nike

我想了解是否应该自己手动从内存中清除原型(prototype) beans

在Spring文档中可以看到:“客户端代码必须清理原型(prototype)范围的对象并释放原型(prototype) bean 持有的昂贵资源。”

由此看来,你应该自己清理prototype-bean。

但是。

我正在使用 VisualVM 内存分析器。我已经创建了许多原型(prototype) bean。您可以看到它们的 51 个实例。

enter image description here

然后你可以看到当垃圾收集器清理内存时的情况——所有的prototype-bean都被清除

enter image description here

所以谁能澄清一下情况? prototype-bean 是否已被垃圾收集器成功清除,或者我们应该手动清除它们(如果是,如何清除)?


添加。有些人要求展示创建原型(prototype) bean 的代码。实际上,我认为这没有任何意义,因为在特定示例中,我只是将它们创建为测试,而这与从内存中清除原型(prototype) bean 的实际情况无关。开发人员可以通过不同的方式创建原型(prototype) bean,但它们的 future 行为不依赖于或不应依赖于创建方法。

在我们的 真实项目 中,我们有超过 400 个组件被注释为 Prototype-beans,我可以看到相同的行为。我向我们的系统发出了一些请求,通过 VisualVM 看到了一些创建的原型(prototype) bean,然后在垃圾收集器清理内存之后,所有原型(prototype) bean 都被清除了。

我展示测试代码只是希望那些询问此问题的人能够提供一些关于真实行为的有意义的信息而不仅仅是空话关于这个特定测试 bean 创建的信息。

测试创建示例的原型(prototype) bean:

for(int i=0;i<10;i++){
Prototype1 prototype1=applicationContext.getBean(Prototype1.class);
Prototype2 prototype2=applicationContext.getBean(Prototype2.class);

prototype1.test1();
prototype2.test2();
}

原型(prototype)bean的测试示例:

@Service
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public class Prototype1 {

private int number;

public Prototype1() {
System.out.println("Prototype1 was created.");
}

public void test1(){

}

}

最佳答案

创建原型(prototype) bean 后;您对其生命周期负责。

一旦您没有对该 bean 的引用,它就消失了。原型(prototype) bean 和作用域 bean 之间唯一真正的区别在于容器如何管理它。

在单元测试中,您不会依赖容器为您提供这些 bean,您只需自己新建它们即可。

因此,要真正回答您的问题,如果您允许应用程序取消引用原型(prototype)对象,则 jvm 的默认行为将消除这些 bean。

 public class Example {

@Scope("prototype")
public static class SomePrototypeBean{

}

@Singleton
public static class MySingleton{

@Bean
private SomePrototypeBean somePrototypeBean;

}

public static void main(String[] args){
// context creation code goes here

// singleton is created, a prototype injected
context.getBean(MySingleton.class);
// NOTE: the prototype injected will last for as long as MySingleton has reference
// my singleton will exist for as long as the context has reference

doStuff(context);
//prototype bean created in the method above will be GCed
}

public static void doStuff(Context context){
context.getBean(MyPrototypeBean.class);
//since we literally are doing nothing with this bean, it will be
// marked for garbage collection
}

}

关于java - 从内存中清理 Spring Prototype-beans 澄清情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44548234/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com