簡體   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