2013-04-15 55 views
2

我正在嘗試向數據庫插入記錄時遇到java堆空間錯誤。我不確定甲骨文如何能夠消耗堆,爲什麼它消耗這麼多。該錯誤是發生在這條線:我在將記錄插入數據庫時​​遇到java堆空間錯誤?

Connection con  = null; 
    PreparedStatement ps = null; 
    ResultSet rs   = null; 
    String sqlString  = null; 
    DaoUtility dUtil  = DaoUtility.getInstance(); 

    try 
    { 
     con = dUtil.getConnection(); 
     . . . 
     dUtil.executeUpdate(ps); 

這裏是日誌:

java.lang.OutOfMemoryError: Java heap space at java.lang.reflect.Array.newArray(Native Method) at java.lang.reflect.Array.newInstance(Array.java:52) at oracle.jdbc.driver.BufferCache.get(BufferCache.java:226) at oracle.jdbc.driver.PhysicalConnection.getCharBuffer(PhysicalConnection.java:7643) at oracle.jdbc.driver.OraclePreparedStatement.setupBindBuffers(OraclePreparedStatement.java:2949) at oracle.jdbc.driver.OraclePreparedStatement.processCompletedBindRow(OraclePreparedStatement.java:2355) at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3571) at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3657) at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate(OraclePreparedStatementWrapper.java:1350) at weblogic.jdbc.wrapper.PreparedStatement.executeUpdate(PreparedStatement.java:172)

+0

你能發佈一些更多的代碼嗎 – Abubakkar

+1

你傳遞了​​一個PreparedStatement,它是'null'。我希望在這種情況下出現錯誤,但它應該是一個'NullPointerException','IllegalArgumentException'或類似的東西。 – Philipp

+0

@ Philipp注意呼叫之上的省略號。無論如何,這個問題並沒有太多關於OP正在使用的詳細Java代碼。 –

回答

1

Oracle JDBC驅動程序是臭名昭著的內存消耗。請閱讀有關configuration parameters可用於控制其內存消耗。特別注意你的情況下的oracle.jdbc.maxCachedBufferSize

0

您還需要檢查適用於JDBC和您的應用程序的JDK版本。有時兩者之間的不匹配也會導致這樣的錯誤。

此外,你可以嘗試插入記錄到另一個(簡單)表。這是爲了確認問題是插入到特定的表中(由於沒有更多的行或數據量)。

1

通常,當沒有足夠的空間分配Java堆中的對象時,會引發此錯誤。在這種情況下,垃圾收集器不能使空間可用來容納新對象,並且堆不能進一步擴展。另外,如果沒有足夠的本機內存來支持加載Java類,則可能會引發此錯誤。在極少數情況下,如果花費過多的時間進行垃圾收集並且釋放少量內存,則可能會拋出java.lang.OutOfMemoryError。