【发布时间】:2011-05-12 12:34:25
【问题描述】:
在 Java Web 应用程序中消除了几个与 PermGen 相关的问题后,我达到了以下几点:
- 应用程序在 Tomcat 6.0.32 中运行并使用 Tomcat 管理的
DataSource -
DataSource在$TOMCAT_HOME/conf/context.xml中定义 - 当应用程序启动时,它会查找
DataSource,并且只有在那个时候才会实例化DataSource; - commons-dbcp 中的
BasicDataSource实现加载GenericObjectPool类,该类又启动java.util.Timer - Timer 启动
TimerThread,它是一个 GC Root,由 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)
定时器显示为被 webapp 类加载器加载
我的第一个想法是让 Tomcat 急切地初始化 DataSource,从而将其固定在通用类加载器中,但我发现没有办法这样做。我当然愿意接受其他方法来解决这个问题(但 JNDI 绑定的资源需要保留)。
如何确保TimerThread 链接到网络应用类加载器?
【问题讨论】:
标签: java tomcat apache-commons-dbcp permgen