[英]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”。
...還有...
您只能將6 GB的2.6 GB XML圖像加載為文檔。 正如jhordo所建議的,該比率更可能是12比1。這是因為每個字節都變成一個16位字符,並且每個標簽,屬性和值都變成一個帶有至少32個字節開銷的字符串。
相反,您應該做的是使用SAX或基於事件的解析器來逐步處理文件。 這樣,它將僅保留您需要保留的盡可能多的數據。 如果您可以一次性處理所有內容,則無需保留任何內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.