java - 获取 java.lang.OutOfMemoryError : Java heap space

标签 java eclipse tomcat out-of-memory hsqldb

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

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

内存不足的东西是什么? eclipse、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)

这是什么意思?

最佳答案

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

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

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

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

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

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

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

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

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


UPDATE 基于迟来的堆栈跟踪

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

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

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


关于增加 HSQLDB 堆栈大小的更新

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

关于java - 获取 java.lang.OutOfMemoryError : Java heap space,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11130675/

相关文章:

如果没有 JAVA_HOME Mac OS,Java Axis 2 脚本将无法启动

java - DialogFragment与Fragment之间的通信

android - Eclipse:为什么以及何时在使用 Maven 项目时将库添加到构建路径而不会有有缺陷的 Eclipse 项目?

java - 在 Android 中创建 JSON

java - 我可以在 maven 的 Profile 中使用 Overlays 吗?

java - Tomcat vs Pivotal tc 服务器

java - Tomcat 启动时 Filter 的 ClassCastException

java - 我正在尝试从类(Starting.java)打开一个类(FlappyBird.java),但我无法使用 "new game().setvisible(true)"

java - java中使用正则表达式分割字符串

javascript - 从源 '...' 访问位于 'http://localhost' 的 XMLHttpRequest 已被 CORS 策略阻止