[英]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參數來搜索增加的堆空間。
這可能會有所幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.