0

我在线程“HSQLDB Connection @3c50507”中遇到异常

java.lang.OutOfMemoryError: Java heap space, when running a JSP.

什么是内存不足?日食,HSQLDB 或 Tomcat?我在 Mac OS X 10.7.4 中使用所有这些

当我启动 HSQLDB 时,我通过控制台得到这个异常:

[Server@122ce908]: From command line, use [Ctrl]+[C] to abort abruptly
Exception in thread "HSQLDB Connection @2e716cb7" java.lang.OutOfMemoryError: Java heap space
    at org.hsqldb.lib.HsqlByteArrayOutputStream.ensureRoom(Unknown Source)
    at org.hsqldb.rowio.RowOutputBinary.ensureRoom(Unknown Source)
    at org.hsqldb.lib.HsqlByteArrayOutputStream.write(Unknown Source)
    at org.hsqldb.rowio.RowOutputBinary.writeByteArray(Unknown Source)
    at org.hsqldb.rowio.RowOutputBinary.writeBinary(Unknown Source)
    at org.hsqldb.rowio.RowOutputBase.writeData(Unknown Source)
    at org.hsqldb.Result.write(Unknown Source)
    at org.hsqldb.Result.write(Unknown Source)
    at org.hsqldb.ServerConnection.run(Unknown Source)
    at java.lang.Thread.run(Thread.java:680)

这是什么意思呢?

4

3 回答 3

2

它不是 Eclipse。您的“应用程序”没有在与 Eclipse 相同的 JVM 中运行,并且您发布的最小错误消息清楚地表明,这正在应用程序中发生......从广义上讲。

从您粘贴到问题中的最小错误消息中不清楚它是 Tomcat 还是 HSQLDB。我认为它更有可能是 Tomcat ......当您从数据库中提取大量结果集时,就会出现问题。但是,如果没有完整的堆栈跟踪,我只是在猜测。

如果这是我怀疑的,那么你有两个选择:

  • 您可以增加运行 Tomcat 的 JVM 的 JVM 堆大小。

  • 您可以找出是什么触发了您的应用程序来填满堆。

    • 可能只是您的应用程序设计要求您从数据库中提取大量数据并将其保存在内存中。在这种情况下,您别无选择,只能增加堆大小,或者(以某种方式)对“问题大小”施加一些限制。

    • 可能是您的应用程序并不真正需要提取所有这些数据;例如,您可以更改您的 SQL 查询,以便需要提取的数据更少。

    • 可能是您不需要同时将所有数据保存在内存中。

    • 可能是您的应用程序中存在潜在的内存泄漏,这就是耗尽所有内存的原因。在这种情况下,增加堆大小就像在车祸受害者身上贴绷带一样。除非你解决真正的问题,否则病人会死。


基于迟来的堆栈跟踪的更新

如果出现问题,您正在从数据库中获取图像,那么该异常来自数据库端。方法名称说它是 WRITING。堆栈跟踪位于 HSQLDB 控制台上的事实证实这是正确的诊断。(此时不太可能发生内存泄漏。您只需要增加堆大小......或者不要在数据库中存储大量图像!)

另一方面,如果它是在您将图像存储到数据库时发生的,那么它是在 Tomcat 端。其他答案之一有一个关于如何处理的链接,

无论哪种方式,从效率的角度来看,将大图像存储在数据库中都不好,并且如果这样做可能会给您的数据库/网络服务器基础架构带来压力......就像您所看到的那样。


更新增加 HSQLDB 的堆栈大小。

我找不到增加 HSQLDB 堆大小的简单“方法”。这取决于您是将它用作嵌入式引擎还是在其自己的 JVM 中启动 HSQLDB。(我的猜测是您正在做后者。)在前一种情况下,您可以通过增加嵌入它的应用程序(例如 Tomcat)的堆大小来处理问题。否则,如果您从命令行启动,请将 -Xmx 和 -Xms 参数添加到java命令行...如java手册页中所述。

于 2012-06-21T02:32:09.770 回答
0

可以是 hsqldb 或 Tomcat。不太可能是 Eclipse,因为它在运行您的应用程序时会分离出一个单独的 JVM。调试它的正确方法是查看堆栈跟踪,看看它是否提供了线索。如果没有,请使用分析器。

于 2012-06-21T02:20:42.043 回答
0

当您在堆上创建太多对象时通常会发生该错误,我怀疑您Strings在从数据库中读取时可能创建了太多。无论哪种方式,问题都与 VM 有关,一个解决方案(如果您不觉得您的代码可能更好)是增加 JVM 的 permgen。

如果您正在 eclipse 中开发,请尝试增加 eclipse 中的 permgen

如果你在Tomcat上部署时出现错误,请尝试在tomcat中增加它

于 2012-06-21T02:21:34.210 回答