Java Spring单例导致内存泄漏

Java Spring单例导致内存泄漏,java,spring,memory-leaks,garbage-collection,Java,Spring,Memory Leaks,Garbage Collection,由于缺乏理解,我在SINGLETON范围内使用了Springbean(默认)。我使用这个bean来填充我的数据结构。数据结构填充在init方法中。在填充数据结构之后,我不再需要bean了。当我分析应用程序可能存在的内存泄漏时,我发现这个单例对象占用了大量内存(它从数据库加载了大量数据) 我猜,应用程序上下文保存所有单例bean的引用,直到它关闭为止。既然我变得聪明了,我想解决这个问题。通过将bean的定义更改为PROTOTYPE,我认为我可以使bean在运行init方法后,一旦超出范围,就有资格

由于缺乏理解,我在SINGLETON范围内使用了Springbean(默认)。我使用这个bean来填充我的数据结构。数据结构填充在init方法中。在填充数据结构之后,我不再需要bean了。当我分析应用程序可能存在的内存泄漏时,我发现这个单例对象占用了大量内存(它从数据库加载了大量数据)

我猜,应用程序上下文保存所有单例bean的引用,直到它关闭为止。既然我变得聪明了,我想解决这个问题。通过将bean的定义更改为PROTOTYPE,我认为我可以使bean在运行init方法后,一旦超出范围,就有资格进行垃圾收集。我的问题是

1) 这是处理这个问题的正确方法吗。 2) 如下面的xml剪报所示。DataPopulator是一个bean,我希望它在执行init方法后被垃圾收集。但它包含对单例对象的引用。这如何不妨碍垃圾收集?理想情况下,这不应该是我所想的。征求你的意见

<bean class="com.foo.DataPopulator" init-method="loadDataOnStartUp" **scope="prototype"**>
    <property name="moService" ref="moServiceRef" />
</bean>

<osgi:reference id="moServiceRef" interface="com.foo.IMoDAO"/>


使用单例bean进行数据初始化并不少见,我更喜欢单例bean而不是原型。内存使用可能是由于bean中包含大量数据的一些成员变量或静态引用造成的。尝试将其重构为仅使用初始化完成时可以垃圾收集的局部变量。

使用单例bean进行数据初始化并不少见,我更喜欢单例bean而不是原型。内存使用可能是由于bean中包含大量数据的一些成员变量或静态引用造成的。尝试将其重构为仅使用初始化完成时可以垃圾收集的局部变量。

如果在应用程序上下文启动期间只需要执行一些方法来初始化
moServiceRef
中的数据,最好不要为
DataPopulator
创建bean。在
moServiceRef
中使用
@PostConstruct
执行必要的方法。如果这不是一个选项,您可以尝试使用
ApplicationListener
并侦听
ContextRefreshedEvent
来运行您的代码。

如果在应用程序上下文启动期间只需要在
moServiceRef
中执行一些方法来初始化数据,那么最好不要为
DataPopulator
创建bean。在
moServiceRef
中使用
@PostConstruct
执行必要的方法。如果这不是一个选项,您可以尝试使用
ApplicationListener
并侦听
ContextRefreshedEvent
来运行代码。

这是一个很好的观点。我同意,如果我可以处理局部变量,我就不必处理巨大的内存泄漏,因为堆栈会自行展开。但还是会有漏洞,但没有那么严重。为什么不能保证垃圾收集的原型范围呢?你做得对。我重新考虑了代码以包含局部变量,并避免了内存泄漏。非常感谢!这是一个很好的观点。我同意,如果我可以处理局部变量,我就不必处理巨大的内存泄漏,因为堆栈会自行展开。但还是会有漏洞,但没有那么严重。为什么不能保证垃圾收集的原型范围呢?你做得对。我重新考虑了代码以包含局部变量,并避免了内存泄漏。非常感谢!