2010-04-27 63 views
1

我在完全相同的情況,因爲這古老的問題:「無法註冊銷燬回調」警告消息導致內存泄漏?

WARN: Could not register destruction callback

總之:我看到一條警告說,銷燬回調無法註冊某些豆類。

我的問題是:因爲其銷燬回調無法註冊的bean是兩個持久性bean,這可能是內存泄漏的來源嗎?

我在遇到應用程序泄漏。雖然會話超時已設置(至30分鐘),但是我的分析器每次運行線程轉儲時都會顯示更多的休眠SessionImpl實例。 SessionImpl的實例數量正好是我嘗試在兩個線程轉儲之間登錄的次數。

感謝您的幫助......

回答

0

確定這裏是我所經歷的昨天:

我的測試(由硒運行)登錄到我的應用程序,並從數據庫加載數據,從而創建一個Hibernate會話。然後它退出。這是每3分鐘完成一次。

的持久性豆由Spring創建如下:

<bean scope="session" 
    id="persistanceService" 
    class="com.a.b.c.PersistanceServiceImpl" 
    p:entityManagerFactory-ref="entityManagerFactory" /> 

實體管理器工廠配置如下:

<bean id="entityManagerFactory" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" 
    p:dataSource-ref="dataSource" p:persistenceUnitName="jpa" > 

    <property name="jpaVendorAdapter"> 
    <bean 
     class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" 
     p:database="ORACLE" 
     p:databasePlatform="org.hibernate.dialect.Oracle9iDialect" 
     p:showSql="false" /> 
    </property> 
    <property name="jpaProperties"> 
    <props> 
     <prop key="hibernate.hbm2ddl.auto">validate</prop> 
    </props> 
    </property>  
</bean> 

我跑的測試,創造了每30分鐘一個線程轉儲,即每10次登錄/註銷。

如果聽衆是而不是集,我可以看到每次登錄和註銷時會話實例都會加起來。會話超時設置爲30分鐘,我可以在日誌中看到會話已失效,因此我預計會話數量在此之後會減少,但仍會增加。 1小時30分鐘後的會話次數爲30次,之後繼續上升。

如果偵聽器已設置,則會話實例數保持較低。實際上,它說因爲一旦測試註銷,http會話失效實際上使休眠會話無效,並且所有事情都是GC。過去15個小時一直如此。

鑑於這一切,我認爲缺少此監聽器很可能導致內存泄漏...

Bozho:你覺得這是什麼?順便說一句,我不是一個有經驗的SO用戶:我是否應該在我的問題中發佈這條消息?我認爲我在這裏回答我自己的問題,所以我添加了一個答案,但不知道:-)

1

我想不會 - 這不應該有任何與Hibernate的Session。它由交易經理打開和關閉。

+0

嗨,感謝您的幫助:)會話可以由事務管理器關閉,但SessionImpl實例仍然保留由Spring bean? Spring使用一個EntityManager配置我的持久性bean,並且該bean沒有被正確銷燬,所以EntityManager留在內存中,並且會話實例也一樣... – 2010-04-27 13:59:17

+0

我不知道,我計劃在附近進行調試未來,並深入到問題的底部。我會告訴你。 – Bozho 2010-04-27 14:03:45

+0

謝謝。我要進一步挖掘,如果我找到某些東西,請更新此頁面...... – 2010-04-27 14:14:32