消除一對夫婦的PermGen的相關問題在Java Web應用程序我已經達到以下點之後:迫使Tomcat的處理數據源進行初始化熱切
- 應用到Tomcat 6.0.32和用途運行一個Tomcat管理
DataSource
- 的
DataSource
在$TOMCAT_HOME/conf/context.xml
- 定義爲當應用程序啓動時,它會查找
DataSource
也只有在那個時候實例化的DataSource
; - 從公地DBCP加載
BasicDataSource
實施GenericObjectPool
類,後者又開始java.util.Timer
- 定時器啓動
TimerThread
這是一個GC根,並通過Web應用程序類加載器加載。
定時器產生的堆棧跟蹤
java.util.Timer.<init>(Timer.java:123)
org.apache.tomcat.dbcp.pool.impl.GenericObjectPool.<clinit>(GenericObjectPool.java:268)
org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1172)
org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:880)
org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:81)
org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:114)
org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2163)
org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2159)
org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1383)
org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954)
org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:855)
org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:774)
org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:211)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
計時器顯示爲通過web應用程序的類加載器加載
我的第一個雖然是問Tomcat來初始化DataSource
熱切地,因此將其固定在普通的類加載器中,但是我發現沒有辦法做到這一點。我當然也可以用其他方式解決這個問題(但是JNDI綁定資源需要保留)。
如何確保TimerThread
已鏈接到Web應用程序類加載器?