繁体   English   中英

Java内存不足异常(jdbc)

[英]java out of memory Exception (jdbc)

我试图在循环中从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占用。 但是我不确定是怎么回事。

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

您可以将其更改为具有以下内容的流式获取:

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

前向只读结果集与访存大小为Integer.MIN_VALUE的组合向驱动程序发出信号以逐行传输结果集。 此后,将使用该语句创建的任何结果集逐行检索。

尝试添加objectIn.close(); 返回之前,可能会有所帮助

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

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

这可能会有所帮助

增加Java中的堆大小

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM