簡體   English   中英

帶有ArrayList <List <Integer >>的Java OutOfMemoryError

[英]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參數 運行配置/參數/ VM參數

由於除了設置max heap參數之外還要使用大量RAM,因此請確保使用64位Java。 32位僅限於2 Gigs或類似的東西。

此外,對於大型圖表,您應該考慮使用數據庫。

最后但並非最不重要的是,也許您可​​以重新考慮您的算法,有時您不需要所有的節點和邊緣。

暫無
暫無

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

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