簡體   English   中英

堆空間不足而導致內存不足錯誤-如何使用Java堆內存

[英]getting heap space out of memory error- how is java heap memory used

我正在讀取一個大小為2.6GB的XML文件-JVM的大小為6GB。

但是我仍然遇到堆空間不足的錯誤嗎?

我在這里做錯了什么...

作為參考,我輸出了JVM的最大內存和空閑內存屬性-

最大內存顯示為大約5.6GB,但是可用內存顯示為僅90MB ...為什么只有90MB顯示為空閑,尤其是。 當我什至沒有開始任何處理時...我剛剛啟動了程序?

在一般情況下,在Java中結構化文本轉換為相應的數據結構時,你需要比輸入文件的大小更多空間。 除了字符串所需的空間之外,與使用的各種數據結構相關的開銷也很多。

例如,每個String實例都有大約32-40字節的額外開銷-更不用說每個字符存儲在兩個字節中了,這實際上使ASCII編碼XML的空間需求增加了一倍。

這樣,在將String存儲在結構中時,就會產生額外的開銷。 例如,為了將String實例存儲在Map您將需要大約16-32字節的額外開銷,具體取決於實現方式和衡量使用情況的方式。

6GB可能不足以立即存儲已解析的2.6GB XML文件...

底線:

如果要在內存中加載如此大的XML文件(例如,使用DOM解析器),則可能是做錯了什么。 基於流的解析器(例如SAX)應具有更為適度的要求。

或者,考慮將XML文件轉換為更有用的文件格式,例如嵌入式數據庫-甚至是基於服務器的實際數據庫。 這樣一來,您就可以處理更大的文檔而不會出現問題。

您應該避免將整個xml一次加載到內存中,而應使用可以處理大量xml的專門類。

這里可能存在幾個不同的問題。

但對於初學者:

1)如果您使用的是64位操作系統,請確保使用的是64位JVM

2)確保您的代碼盡快關閉所有打開的資源。

3)明確將對大型對象的引用設置為“ null”。

...還有...

4)熟悉JConsoleVisualVM

您只能將6 GB的2.6 GB XML圖像加載為文檔。 正如jhordo所建議的,該比率更可能是12比1。這是因為每個字節都變成一個16位字符,並且每個標簽,屬性和值都變成一個帶有至少32個字節開銷的字符串。

相反,您應該做的是使用SAX或基於事件的解析器來逐步處理文件。 這樣,它將僅保留您需要保留的盡可能多的數據。 如果您可以一次性處理所有內容,則無需保留任何內容。

暫無
暫無

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

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