由于Spring单例导致内存泄漏

时间:2014-07-11 14:23:49

标签: java spring memory-leaks garbage-collection

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

我猜,应用程序上下文会保留所有单例bean的引用,直到它关闭为止。既然我已经变得聪明了,我想解决这个问题。通过将bean的定义更改为PROTOTYPE,我认为只要它超出运行init-method之后的范围,我就会使bean有资格进行垃圾收集。我的问题是

1)这是处理问题的正确方法吗? 2)在xml片段中显示如下。 DataPopulator是我想在执行init-method后进行垃圾回收的bean。但它保留了对单例对象的引用。这怎么不妨碍垃圾收集?理想情况下,它不应该是我的想法。寻求你的意见。

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

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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