簡體   English   中英

Java內存限制?

[英]Java memory limits?

我正在研究一個java程序,它將文件解析為列表,然后將數據插入到數據庫中。 這在具有大量內存的服務器上運行。 我需要注意java限制嗎?

例如,在將數據插入數據庫之前,我不應該將GB數據解析成列表?

您需要擔心的不僅僅是Java的限制。

存在網絡帶寬使用,占用數據庫服務器CPU,填充數據庫事務日志,批量插入的JDBC性能,數據庫更新其索引時生成緩慢或生成人工密鑰。

如果您的輸入太大,則需要將它們拆分為塊並分別提交塊。 太大有多大取決於您的數據庫。

分配人工密鑰的方式可以減慢過程,您可能需要提前創建批量值,例如使用hilo生成器。

啟動一堆線程並用它們錘擊數據庫服務器只會引起爭用並使數據庫服務器更加努力,因為它必須整理事務並確保它們不會相互干擾。

考慮寫入某種分隔文件,然后運行批量插入實用程序將其內容加載到數據庫中。 這樣數據庫實際上可以合作,它可以暫停更新索引和檢查約束,序列和事務不是問題。 它比JDBC快幾個數量級。

Nathans的答案很不錯 - 所以我只會在這里添加一些內容......

如果你沒有在你的程序中做任何非常復雜的事情,那么以流式方式編寫可能是一種好習慣 - 簡單來說,一次讀取輸入一行,然后直接將其輸出到文件,最后調用數據庫的具體(大多數都有一個)批量上傳工具。

將所有行讀入內存,然后在循環上調用insert()將是非常低效的。

你沒有給我們提供很多線索,說明為什么你要一次性閱讀這些數據 - 是否有理由需要這樣做?

這取決於您為JVM分配的內存量。

您可以為JVM分配多少內存取決於客戶端VM(或)服務器VM類型。

檢查-Xmx-Xms 設置

不是直接的,但您可能想稍微調整JVM參數。

啟動JVM時,Xms和Xmx參數是什么? 可能是一個有用的參考。

您可能需要注意的限制是

  • 列表不能有2 ^ 31個條目或更多。
  • 一個JVM確實可以擴展到32 GB,但不會高得多,因為GC的成本會隨着堆大小的增加而增加(除非你有Azul的Zing)

如今,如果在一個JVM(或Zing)中需要超過32 GB,我建議使用非堆內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM