2

我收到 java 堆空间错误,但在尝试将记录插入数据库时​​。我不确定 oracle 为何能够消耗堆以及为什么消耗这么多。此行发生错误:

 Connection con       = null;
    PreparedStatement ps = null;
    ResultSet rs         = null;
    String sqlString     = null;
    DaoUtility dUtil     = DaoUtility.getInstance();

    try
    {
      con = dUtil.getConnection();
      . . .
      dUtil.executeUpdate(ps);

这是日志:

java.lang.OutOfMemoryError: java.lang.reflect.Array.newArray(Native Method) at java.lang.reflect.Array.newInstance(Array.java:52) at oracle.jdbc.driver.BufferCache.get 的 Java 堆空间(BufferCache.java:226) 在 oracle.jdbc.driver.PhysicalConnection.getCharBuffer(PhysicalConnection.java:7643) 在 oracle.jdbc.driver.OraclePreparedStatement.setupBindBuffers(OraclePreparedStatement.java:2949) 在 oracle.jdbc.driver.OraclePreparedStatement。 processCompletedBindRow(OraclePreparedStatement.java:2355) 在 oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3571) 在 oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3657) 在 oracle.jdbc.driver.OraclePreparedStatementWrapper .在 weblogic.jdbc.wrapper.PreparedStatement.executeUpdate(PreparedStatement.java:172)处执行更新(OraclePreparedStatementWrapper.java:1350)

4

3 回答 3

1

Oracle JDBC 驱动程序因内存消耗而臭名昭著。请阅读您可以使用的配置参数来控制其内存消耗。特别要注意oracle.jdbc.maxCachedBufferSize你的情况。

于 2013-04-15T09:39:36.793 回答
1

通常,当 Java 堆中没有足够的空间来分配对象时会引发此错误。在这种情况下,垃圾收集器无法腾出空间来容纳新对象,并且无法进一步扩展堆。此外,当本机内存不足以支持 Java 类的加载时,可能会引发此错误。在极少数情况下,当花费过多时间进行垃圾收集并且释放的内存很少时,可能会抛出 java.lang.OutOfMemoryError。

于 2016-04-29T12:56:13.103 回答
0

您还需要检查 JDBC 和您的应用程序的 JDK 版本。有时两者之间的不匹配也会导致这种错误。

您也可以尝试将记录插入到另一个(简单)表中。这是为了确认问题在于插入特定表(由于更多的行或数据量)。

于 2013-04-15T10:32:08.273 回答