我有一个运行在Tomcat6上的web应用程序,它是我用Netbeans 6.9.1及其实体类和持久性向导创建的。它使用Hibernate,MySQL作为数据库,Quartz每15分钟运行一次任务,以及JavaMail。
hibernate配置如下:
<?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>使用Quartz创建的任务每15分钟运行一次,使用JavaMail (使用IMAP)检查GMail帐户,检索所有消息,处理它们(查找一些信息),并使用Hibernate将包含这些信息的对象存储到数据库中。然后它将所有邮件标记为已删除,这样它们就不会在下一次运行时被处理。
每次运行此任务时,它都会消耗10、20、50MB的空间,具体取决于它处理的邮件数量。我已经查看了MySQL管理器,当不需要时,数据库连接被关闭。但是,如果我查看进程内存(在它运行的linux机器中),内存会一直增长,直到达到CPU使用率为100%的限制,Tomcat不再响应。
我已经多次更改-Xms -Xmx和PermGem大小,以尝试不同的解决方案,但它总是达到系统停止工作和内存未被释放的地步。
你知道我可以从哪里开始寻找这个问题吗?我已经为Java VM分配了超过1.5 it的空间,即使它持续了一天多,它也会挂起。
当Tomcat和所有应用程序停止工作时,将不会出现堆栈跟踪。
谢谢
发布于 2011-07-07 23:24:08
在JDK中附加jvisualvm以获得内存分析。
请注意,据我所知,JavaMail不能有效地处理大型附件,并且生成的邮件会变得更大。因此,您必须确保在处理下一封邮件之前已将其从内存中清除。
我建议您设置一个本地SMTP服务器--对于大多数Linux发行版来说,这非常容易--并让您的Java应用程序与之对话。这将使您的任务完成得更快,然后释放内存。
如果您一直收到OOM异常,那么可以考虑在单独的JVM中运行邮件发送,这样它就不会影响应用程序的其余部分。
https://stackoverflow.com/questions/6612778
复制相似问题