java内存不足异常(jdbc)

时间:2012-10-08 22:12:04

标签: java mysql jdbc heap-memory

我试图在循环中从mysql数据库中读取序列化对象,并在java中对它执行一些操作。 我编写了以下函数,用于从ResultSet返回对象的对象。

public static MyObj deSerializeCacheTagInfo(ResultSet res
    ) throws SQLException, IOException, ClassNotFoundException 
{
    byte[] buf = res.getBytes(3);
    ObjectInputStream objectIn = null;
    if (buf != null)
        objectIn = new ObjectInputStream(new ByteArrayInputStream(buf));
    MyObj info = (MyObj)objectIn.readObject();
    return info;
}

当我运行此代码时,它会给我一个内存不足的异常。 我搜索了一下,意识到这可能是因为结果集很大并且它保存在内存中,所以我尝试一次取50行。

但这似乎也没有帮助。

在使用visualvm进行分析时,它会报告所有空间都被byte[] objects占用。 但我不完全确定会出现什么问题。

3 个答案:

答案 0 :(得分:3)

默认情况下,MySQL JDBC驱动程序将完整的ResultSet 提取到内存中。

您可以使用以下内容将其更改为流式提取:

Statement st = connIn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
st.setFetchSize(Integer.MIN_VALUE);

只读的只读结果集与提取大小Integer.MIN_VALUE的组合用作驱动程序逐行传输结果集的信号。在此之后,将逐行检索使用该语句创建的任何结果集。

答案 1 :(得分:0)

尝试在返回前添加objectIn.close();,这可能有帮助

答案 2 :(得分:0)

您可以使用选项-mx256m用于256mb堆空间或-mx512m用于512mb等等来增加堆空间。

通过在网络上设置VM参数来搜索增加的堆空间。

这可能会有所帮助

Increase heap size in Java