首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有Hibernate、Quartz和和JavaMail的应用程序中的Java OutOfMemory

带有Hibernate、Quartz和和JavaMail的应用程序中的Java OutOfMemory
EN

Stack Overflow用户
提问于 2011-07-07 23:05:32
回答 4查看 524关注 0票数 1

我有一个运行在Tomcat6上的web应用程序,它是我用Netbeans 6.9.1及其实体类和持久性向导创建的。它使用Hibernate,MySQL作为数据库,Quartz每15分钟运行一次任务,以及JavaMail。

hibernate配置如下:

代码语言:javascript
运行
复制
<?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和所有应用程序停止工作时,将不会出现堆栈跟踪。

谢谢

EN

回答 4

Stack Overflow用户

发布于 2011-07-07 23:24:08

在JDK中附加jvisualvm以获得内存分析。

请注意,据我所知,JavaMail不能有效地处理大型附件,并且生成的邮件会变得更大。因此,您必须确保在处理下一封邮件之前已将其从内存中清除。

我建议您设置一个本地SMTP服务器--对于大多数Linux发行版来说,这非常容易--并让您的Java应用程序与之对话。这将使您的任务完成得更快,然后释放内存。

如果您一直收到OOM异常,那么可以考虑在单独的JVM中运行邮件发送,这样它就不会影响应用程序的其余部分。

票数 2
EN

Stack Overflow用户

发布于 2011-07-07 23:14:50

一般方法:获取内存转储,查找最多的对象或最大的对象,看看它们是否应该不存在,但仍然存在。然后,您可以看到是哪些对象阻止了垃圾被收集(通过持有对垃圾的引用)。

票数 0
EN

Stack Overflow用户

发布于 2011-07-07 23:48:34

如何管理进程运行之间的Hibernate会话?您确定您没有将进程以前运行的所有缓存对象都保存在Hibernate会话缓存或您自己的缓存中吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6612778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档