0

Java WebアプリケーションでいくつかのPermGen関連の問題を排除した後、私は次の点に到達しました。

  • アプリケーションはTomcat6.0.32で実行され、Tomcat管理を使用しますDataSource
  • DataSource定義されています$TOMCAT_HOME/conf/context.xml
  • アプリケーションが起動すると、アプリケーションが検索し、DataSourceその時点でのみDataSourceインスタンス化されます。
  • BasicDataSourcecommons-dbcpからの実装はクラスをロードし、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)

webappクラスローダーによってロードされているように表示されるタイマー

GCのルーツ

私の最初は、TomcatにDataSource熱心に初期化するように依頼し、それを一般的なクラスローダーに固定することでしたが、それを行う方法が見つかりませんでした。もちろん、これを解決する他の方法も受け入れています(ただし、JNDIにバインドされたリソースはそのままにしておく必要があります)。

TimerThreadがWebアプリクラスローダーにリンクされていることを確認するにはどうすればよいですか?

4

1 に答える 1

0

理解できませんでしDataSourceた。1回だけロードする必要がありますか?server.xmlにとして配置しますGlobalNamingResource。context.xmlからwebappsで参照します。(詳細については、 http://tomcat.apache.org/tomcat-5.5-doc/config/globalresources.htmlを参照してください)

1つのWebアプリケーションにロードする必要があります。Webアプリケーションのコンテキストxmlに配置します。

tomcats context.xmlは、すべてのWebアプリケーションに対して一度にロードする必要のあるリソースを含むことを目的としています。(したがって、5つのWebアプリがあると5つのインスタンスになります。)

それでも問題が解決しない場合は、tomcatsとwebappsのコンテキストxmlを投稿してください。

于 2011-10-21T17:07:45.650 に答える