【问题标题】:GC overhead limit exceeded to get the rowcount超过 GC 开销限制以获取行数
【发布时间】:2014-05-08 09:02:27
【问题描述】:

我在尝试获取行数时遇到“超出 GC 开销限制”异常。你能告诉我是什么问题吗

Java 代码:

try{
    rs = RtHelper.getResultSet(hm, sortColumn, sortOrder, con);
    if (rs != null) {
    rs.last();
    rowCountValue = rs.getRow();
    }
    }catch(Exception exception){

    }finally{
    if (rs!=null)
    rs.close();
    }

2014-05-08 00:27:47,948 ==== MYService.java ==== thread: jmsContainer-7349 ==== ERROR >
com....jms.MyService.printException() => (line: 263)
Exception: java.lang.OutOfMemoryERROR: GC overhead limit exceeded
at oracle.jdbc.driver.ScrollableResultSet.cacheCurrentRow(ScrollableResultSet.java:2257)
at oracle.jdbc.driver.ScrollableResultSet.cacheAllRows(ScrollableResultSet.java:2315)
at oracle.jdbc.driver.ScrollableResultSet.getLastRow(ScrollableResultSet.java:2368)
at oracle.jdbc.driver.ScrollableResultSet.last(ScrollableResultSet.java:477)
at org.apache.commons.dbcp.DelegatingResultSet.last(DelegatingResultSet.java:329)

【问题讨论】:

  • 如果你只想要行数,你的 SQL 应该是 SELECT COUNT(*) FROM table。这仅返回行数。
  • 没错。这基本上是一种获取行数的愚蠢方法。根据@GilbertLeBlanc 的建议,它可能是 O(1)O(N)

标签: java oracle


【解决方案1】:

可能是您的结果集数据大小对于可用的 JVM 堆内存来说太大了。

如果您有足够的 RAM,您可以增加 Java 堆大小。 如果数据非常大,也可以批量检索结果。

根据你的可用内存添加这样的JVM参数,

-Xms512m -Xmx2g -XX:PermSize=512m  -XX:MaxPermSize=2g

此示例将分配总共 4 GB 内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 2020-02-26
    相关资源
    最近更新 更多