【问题标题】:Out Of Memory using Postgres in Java在 Java 中使用 Postgres 内存不足
【发布时间】:2008-12-17 13:04:00
【问题描述】:

好吧,我们有一个运行在 JBoss 上的 Web 应用程序,当尝试在 postgres 数据库的多个表中插入大量行时,我们遇到了“OutOfMemory”错误。 这是此错误的完整环境:
* JBoss 4.3.x 正式版
* Java 1.6.0
* 休眠 3.0
* postgreSQL-8.3(驱动程序)
关于实际的代码工作环境:
* 关于这一点的重要部分是我们正在解析大量的 xml 文档,每个文档都是从特定的 URL 单独下载的(1 个 URL = 1 个 XML)。我们通过使用 EJB 将生成的 URL 分发到队列中来实现这一点,然后 MDB 池使用流连接并生成文档(请注意,由于 XML 文档的大小,我们实际上不得不增加堆栈内存,而且我们正在坚持必须在一个流中获取所有文档),一旦生成文档,它就会进入另一个队列,另一个 MDB 池在该队列中侦听。
这些 MDB 解析文档,将信息存储在几个实体(至少 5 个)中,然后持久保存在数据库中(请注意,事务管理设置为 "BEAN" 并在每个 MDB 期间开始和提交工作)。按顺序处理 URL 不是一种选择,因为要处理的 URL 数量很多,大约需要 2 个月左右...lol

问题是......我们解析和存储了大约 200 个 URL,然后开始出现 postgreSQL 的内存不足错误。 有什么想法吗??

提前致谢!!

ALSO:知道这个错误之前没有出现(我之前确实解析了数千个 XML)可能是有用的,只生成文档并将其中的一些解析为某些实体似乎并没有带来麻烦。当我们开始将越来越多的文档解析为其对应的实体时,麻烦就开始了。 (就像一个实体有一个“特征”列表[从同一个 xml 解析的其他实体])

【问题讨论】:

  • 当您说“postgreSQL 内存不足”时,您的意思是您的 jboss 实例抛出了异常,还是您的意思是 PostgreSQL 守护进程本身内存不足?
  • Java Stack Trace 中显示了异常,但我认为它是在 PostgreSQL 端生成的。
  • 您在 PostgreSQL 守护进程的日志文件中看到什么了吗?至少发布您看到的堆栈跟踪。
  • 实际上,这是堆栈跟踪的第一行:11:36:17,730 WARN [PersistenceManager] SQLException catched - 假设检测到死锁,try:4 java.sql.SQLException: out of memory
  • 服务器上的 PostgreSQL 日志没有显示任何异常,但我读到 PostgreSQL 驱动程序在服务器端和客户端都保持游标......我不确定。

标签: java postgresql memory


【解决方案1】:

听起来您将所有 200 个文档的所有 bean 都保存在内存中。

不要将所有数据一直保存在 RAM 中,而是尽可能快地删除它。

因此,当您完成读取某个 bean 的数据时,将其持久化,然后忘记它(将对象引用设置为 null),除了可能需要创建引用的键。

如果您无法做到这一点,请使用分析器来确保您在解析文档后不会保留对文档的引用。通常,在将整个文档保存在数据库中之后,您不需要将其保存在任何地方。如果这是一个问题,请创建一个带有引用的表,它允许您在文档之间进行链接,并将该表中的键保存在内存中(而不是整个文档)。

【讨论】:

  • Aaron:当我不再需要任何实体 bean 或文档实例时,我会立即处理它们,这实际上是我持久化它们的时候。 Ben:我使用两个池只是为了节省一些时间,因为从 URL 流中获取文档需要一秒钟,而解析它需要另一秒钟,所以我尝试“模拟”并行处理而不是进行下载和解析/依次坚持。感谢两位!
【解决方案2】:

简短的回答是需要更多信息。我建议使用JProfiler 之类的工具来帮助了解内存消耗的位置。

根据您描述的设计:为什么要使用两个池?如果您只有一个 URL 池,那么工作线程可以从该池中提取,解析 URL 并创建实体 bean,将它们保存到数据库中。

不清楚为什么需要中间 XML 步骤,这听起来可能是高内存消耗的来源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    • 2012-06-21
    • 2013-09-10
    • 2012-12-12
    • 2017-07-19
    • 1970-01-01
    相关资源
    最近更新 更多