[Seasar-user:19102] S2JDBCでOutOfMemoryError: PermGen space

しましま [E-MAIL ADDRESS DELETED]
2010年 1月 5日 (火) 23:25:24 JST


はじめまして、しましまと申します。

S2JDBCを使用中に「OutOfMemoryError: PermGen space」が発生する現象に遭遇したので、報告します。

Webアプリケーションを作って、Tomcatに何度も再配備を繰り返すと、約25回ぐらいで「OutOfMemoryError: PermGen space」が発生して、Webアプリケーションが(ときにはTomcatごと)動かなくなります。

実行環境は以下のとおりです。

OS: MacOS X 10.6.2
JavaVM: 1.6.0_17-b04-248-10M3025
Tomcat: 6.0.20
Seaser2: 2.4.39
MySQL connector J: 5.1.10

(warの内容)
war/WEB-INF/web.xml
war/WEB-INF/lib/aopalliance-1.0.jar
war/WEB-INF/lib/commons-logging-1.1.jar
war/WEB-INF/lib/geronimo-jpa_3.0_spec-1.0.jar
war/WEB-INF/lib/geronimo-jta_1.1_spec-1.0.jar
war/WEB-INF/lib/javassist-3.4.ga.jar
war/WEB-INF/lib/log4j-1.2.13.jar
war/WEB-INF/lib/mysql-connector-java-5.1.10-bin.jar
war/WEB-INF/lib/ognl-2.6.9-patch-20090427.jar
war/WEB-INF/lib/s2-extension-2.4.39.jar
war/WEB-INF/lib/s2-framework-2.4.39.jar
war/WEB-INF/lib/s2-tiger-2.4.39.jar
war/WEB-INF/classes/app.dicon
war/WEB-INF/classes/convention.dicon
war/WEB-INF/classes/jdbc.dicon
war/WEB-INF/classes/log4j.properties
war/WEB-INF/classes/s2jdbc.dicon

(web.xmlの内容)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
		version="2.5">
	<servlet>
		<servlet-name>s2container</servlet-name>
		<servlet-class>org.seasar.framework.container.servlet.S2ContainerServlet</servlet-class>
		<init-param>
			<param-name>configPath</param-name>
			<param-value>app.dicon</param-value>
		</init-param>
		<init-param>
			<param-name>debug</param-name>
			<param-value>true</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>s2container</servlet-name>
		<url-pattern>/s2container/*</url-pattern>
	</servlet-mapping>
</web-app>

(app.diconの内容)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd">
<components>
	<include path="aop.dicon"/>
	<include path="s2jdbc.dicon"/>
</components>

(jdbc.diconの内容)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd">
<components namespace="jdbc">
	<include path="jta.dicon"/>
	<include path="jdbc-extension.dicon" condition="@[E-MAIL ADDRESS DELETED]('convention.dicon')"/>
	<component class="org.seasar.extension.jdbc.impl.BasicResultSetFactory"/>
	<component class="org.seasar.extension.jdbc.impl.ConfigurableStatementFactory">
		<arg>
			<component class="org.seasar.extension.jdbc.impl.BasicStatementFactory"/>
		</arg>
		<property name="fetchSize">100</property>
	</component>
	<component name="xaDataSource" class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
		<property name="driverClassName">"com.mysql.jdbc.Driver"</property>
		<property name="URL">"jdbc:mysql://localhost:3306/test"</property>
		<property name="user">"xxx"</property>
		<property name="password">"xxx"</property>
	</component>
	<component name="connectionPool" class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl">
		<property name="timeout">600</property>
		<property name="maxPoolSize">10</property>
		<property name="allowLocalTx">true</property>
		<destroyMethod name="close"/>
	</component>
	<component name="dataSource" class="org.seasar.extension.dbcp.impl.DataSourceImpl"/>
</components>

(Tomcatのログ)
情報: Reloading context [/war]
INFO  2010-01-05 22:40:49,549 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] s2-frameworkのバージョンは2.4.39です。
INFO  2010-01-05 22:40:49,550 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] s2-extensionのバージョンは2.4.39です。
INFO  2010-01-05 22:40:49,550 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] s2-tigerのバージョンは2.4.39です。
DEBUG 2010-01-05 22:40:49,595 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] S2Containerを作成します。path=app.dicon
DEBUG 2010-01-05 22:40:49,611 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] S2Containerを作成します。path=aop.dicon
DEBUG 2010-01-05 22:40:49,686 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] S2Containerを作成しました。path=aop.dicon
DEBUG 2010-01-05 22:40:49,687 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] S2Containerを作成します。path=s2jdbc.dicon
DEBUG 2010-01-05 22:40:49,689 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] S2Containerを作成します。path=jdbc.dicon
DEBUG 2010-01-05 22:40:49,692 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] S2Containerを作成します。path=jta.dicon
DEBUG 2010-01-05 22:40:50,022 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] S2Containerを作成しました。path=jta.dicon
DEBUG 2010-01-05 22:40:50,939 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] S2Containerを作成します。path=jdbc-extension.dicon
DEBUG 2010-01-05 22:40:50,941 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] S2Containerを作成します。path=convention.dicon
DEBUG 2010-01-05 22:40:50,953 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] S2Containerを作成しました。path=convention.dicon
DEBUG 2010-01-05 22:40:50,957 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] S2Containerを作成しました。path=jdbc-extension.dicon
2010/01/05 22:40:56 org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor processChildren
致命的: Exception invoking periodic operation: 
java.lang.OutOfMemoryError: PermGen space



OutOfMemoryErrorの発生タイミングによって、ログの出かたが異なります。
「S2Containerを作成します。path=jdbc.dicon」に対応する「S2Containerを作成しました。path=jdbc.dicon」が無いため、jdbc.diconで問題が発生していると思われます。
jdbc.dicon内のdriverClassNameに無効なクラス名を設定するとOutOfMemoryError: PermGen spaceは発生しなくなります。(代わりにClassNotFoundExceptionが発生しますが)
また、MySQLをPostgreSQLに変更してもOutOfMemoryError: PermGen spaceが発生するので、JDBCドライバ側ではなく、Seaser2側の問題だと思われます。



以上、よろしくお願いします。

-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: <http://ml.seasar.org/archives/seasar-user/attachments/20100105/e852a024/attachment.html>


Seasar-user メーリングリストの案内