[英]Java OutOfMemoryError with ArrayList<List<Integer>>
我想用Java創建一個非常大的圖形(有大約1000萬條邊)。 我計划List<List<Integer>>
來描述邊緣,內部List<Integer>
描述每條邊的兩個頂點(並且頂點是整數類型)。
在將約100萬條邊添加到圖形后,以下代碼拋出OutOfMemoryError
。 (為了討論起見,我簡化了邊緣的生成方式。)
public static void main(String[] args) {
List<List<Integer>> graph = new ArrayList<List<Integer>>();
for (int i = 0; i < 10000000; i++) {
List<Integer> edge = new ArrayList<Integer>();
// the real edges are more complicated (than from vertex i to vertex i+1)
// this is simplified for the sake of the discussion here
edge.add(i);
edge.add(i+1);
graph.add(edge);
}
}
我搜索了OutOfMemoryError
,並且我已經將Eclipse的初始堆大小增加到2G: -Xms2g -Xmx4g -Xss2m
(它被傳遞給JVM)。 但這並沒有解決問題。
然后我想也許我應該通過調用System.gc()
來垃圾收集List<Integer> edge
變量,以防它的內存沒有被清除。 那也行不通。
我在想可能問題在於List<List<Integer>>
數據結構。 我嘗試了List<int[]>
,這持續了一段時間:在OutOfMemoryError
發生之前添加了更多邊。 我現在沒有更好的主意。
我一直在尋找類似的問題,但沒有找到太多幫助。 我想知道是否有人有這種情況的經驗。
讓程序使用Eclipse中的更多內存:
轉到“運行” - >“運行配置”。 你會看到這個窗口
單擊Arguments
輸入您的VM參數
由於除了設置max heap參數之外還要使用大量RAM,因此請確保使用64位Java。 32位僅限於2 Gigs或類似的東西。
此外,對於大型圖表,您應該考慮使用數據庫。
最后但並非最不重要的是,也許您可以重新考慮您的算法,有時您不需要所有的節點和邊緣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.