私はNetbeans 6.9.1で作成したTomcat 6上で動作するWebアプリケーションを持ち、Entityクラスと永続性のためにウィザーズを使用しています。これは、Hibernate、データベースとしてのMySQL、15分ごとにタスクを実行するためのQuartz、およびJavaMailを使用します。Java OutOfMemory in Hibernate、Quartz and and JavaMail
次のように休止状態の設定は次のとおりです。
<?xml version="1.0" encoding="UTF-8" ?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="GVPU" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>com.test.MyfirstEntity</class>
<class>com.test.MySecondEntity</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<property name="hibernate.connection.username" value="root" />
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
<property name="hibernate.connection.password" value="password" />
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/db" />
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider" />
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider" />
<property name="hibernate.c3p0.acquire_increment" value="1" />
<property name="hibernate.c3p0.idle_test_period" value="300" />
<property name="hibernate.c3p0.timeout" value="100" />
<property name="hibernate.c3p0.max_size" value="100" />
<property name="hibernate.c3p0.min_size" value="0" />
<property name="hibernate.c3p0.max_statements" value="0" />
</properties>
</persistence-unit>
</persistence>
15分ごとに実行クォーツで作成したタスク、(IMAPで)のJavaMailを使用してGmailアカウントをチェックし、すべてのメッセージを取得し、プロセス彼ら(ルックスいくつかの情報について)、その情報を持つオブジェクトをHibernateを使用してDBに格納します。その後、すべてのメールを削除済みとしてマークするので、次の実行時には処理されません。
このタスクが実行されるたびに、処理するメールの数に応じて10,20,50MBを消費します。私はMySQL Administratorを見てきましたが、DB接続は必要ないときに閉じられます。しかし、私が(実行しているLinuxマシンの)プロセスメモリを見れば、CPU使用率が100%の限界に達するまでメモリが増加し、Tomcatはこれ以上応答しません。
さまざまな解決策を試すために、-Xms -XmxとPermGem Sizeを数回変更しましたが、システムが動作を停止してメモリが解放されていないポイントに常に到達します。
この問題をどこから見つけることができますか?私はJava VMに1.5GB以上の容量を割り当てました。また、1日以上経過してもハングアップします。
Tomcatとすべてのアプリケーションが動作を停止すると、スタックトレースはありません。
おかげ