首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 批量寫入資料庫 9 萬筆觸發 OutOfMemoryError:JVM 堆記憶體不足解決方案

     編輯:程式設計綜合問答

錯誤堆疊

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at com.mysql.jdbc.PreparedStatement.<init>(PreparedStatement.java:437)
    ...
    at tree.database.MySQLCor.insert(MySQLCor.java:263)

原因分析

  • PreparedStatement 物件在建立時會在 JVM 堆分配記憶體緩衝 SQL 與參數。
  • 迴圈中重複 conn.prepareStatement(sql) 產生大量 PreparedStatement 實例,若未及時 close() 或批次提交,堆積導致 OOM。
  • MySQL JDBC 驅動預設會在客戶端緩衝結果集,大量寫入同樣佔用堆。

解決方案

  1. 調大 JVM 堆(治標):
    java -Xms512m -Xmx2g -jar your-app.jar
  2. 分批提交 + 重用 PreparedStatement(治本):
    String sql = "INSERT INTO t(...) VALUES(...)";
    try (PreparedStatement ps = conn.prepareStatement(sql)) {
        for (int i = 0; i < total; i++) {
            ps.setString(1, ...); ...
            ps.addBatch();
            if (i % 1000 == 0) { ps.executeBatch(); conn.commit(); }
        }
        ps.executeBatch(); conn.commit();
    }
  3. 關閉自動提交:conn.setAutoCommit(false),手動控制事務邊界。
  4. 使用 rewriteBatchedStatements=true 連線參數,驅動端合併批次 SQL 減少網路交互。

參考連結

JVM 記憶體調優實戰

總結

大量寫入必須「批次、重用、手動提交」,單純調大堆只能延緩崩潰。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved