4

Open J2EE Web テンプレートは、Tomcat7 サーブレット コンテナーで実行される wicket - Spring と Hibernate を備えた JPA のショーケース アプリケーションです。その Maven ビルド スクリプトは、コンポーネントを標準的な方法で使用しているように見えます。

ただし、Tomcat からアンデプロイすると、アプリケーション クラスローダーのメモリ リークの影響を受けます。

Tomcat の「Find Leaks」ボタンは、リークを確認します。VM オプション -XX:+HeapDumpOnOutOfMemoryError を使用して Tomcat にデプロイすると、生成されたヒープ ダンプを Eclipse メモリ アナライザー ツール (MAT) で分析できます。MAT は、java.util.logging.Level$KnownLevelガベージ コレクションを妨げている原因としてクラスを識別します。

コンストラクターをデバッグするとKnownLevel、次のスタック トレースが明らかになります。

java.util.logging.Level$KnownLevel.add(Level.java:477) java.util.logging.Level.(Level.java:212) java.util.logging.Level.(Level.java:190) org. jboss.logging.JDKLevel.(JDKLevel.java:35) org.jboss.logging.JDKLevel.(JDKLevel.java:42) org.jboss.logging.JDKLogger.translate(JDKLogger.java:78) org.jboss.logging. JDKLogger.isEnabled(JDKLogger.java:85) org.jboss.logging.Logger.debugf(Logger.java:563) org.jboss.logging.LoggerProviders.find(LoggerProviders.java:37) org.jboss.logging.LoggerProviders. (LoggerProviders.java:32) org.jboss.logging.Logger.getLogger(Logger.java:2163) org.jboss.logging.Logger.getMessageLogger(Logger.java:2259) org.jboss.logging.Logger.getMessageLogger(Logger) .java:2214) org.hibernate.ejb.Ejb3Configuration.(Ejb3Configuration.java:144) org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:74) org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:268) org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:310) org.springframework.beans. factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514) org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452) 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:294) org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225) org .springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291) org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) org.springframework.beans.factory.support.DefaultListableBeanFactory .preInstantiateSingletons(DefaultListableBeanFactory.java:567) org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913) org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464) org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:385) org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:284) org.springframework.web.context.ContextLoaderListener. contextInitialized(ContextLoaderListener.java:111) org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4939)

クラスローダーのリーク: 恐ろしい "java.lang.OutOfMemoryError: PermGen space" 例外を正しく理解していれば、このクラスローダーのリークは予想されます。

これを回避するために推奨される方法は何ですか、または Tomcat での代替の Spring/JPA テンプレート Web アプリケーションは何ですか?

4

2 に答える 2

1

Logbackなどの java.util.logging 以外のロギング フレームワークを構成します。

ロギングがまったく設定されていない場合、または java.util.logging が設定されている場合、jboss ロギングは、JDK バグLevel.known can leak memoryを介してクラスローダー リークを作成します。jboss ロギングがカスタム java.util.logging.Level を作成する質問のスタック トレースを参照してください。

于 2013-08-16T21:20:43.760 に答える