簡體   English   中英

Java OutOfMemoryError即使使用正確的結構化?

[英]Java OutOfMemoryError even with Correct Structuring?

我正在使用Java中的2D int數組,它是正方形,並且在行和列中可以有大約30000個元素,這意味着數組中有30000 ^ 2 * 4個字節,小於5GB(我還有更多超過5GB的內存可用)。

我的程序的基本結構是這樣的:

public class A {
    public static void main(String[] args) {
        Graph g = ...; // read from file
        System.out.println(B.computeSomethingBig(g));
    }
}

public class B {
     public static computeSomethingBig(Graph g) {
         int numVertices = g.numVertices();
         System.out.println(numVertices); // ~30000 maximum
         int[][] array = new int[numVertices][numVertices];
         // ... other computations
     }
}

現在,在Eclipse中,我使用以下參數在A類中運行main

-Xms5g -Xmx10g

我有numVertices打印出一個大約30000的值,並設置最小堆大小( -Xms )似乎是不必要的。 但是,我得到:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

運行以下內容:

public class A {
        public static void main(String[] args) {
                int numVertices = 30000;
                int[][] array = new int[numVertices][numVertices];
        }
}

沒有任何參數,即java A導致OOM錯誤。 運行java -Xms5g -Xmx10g A有效。 我懷疑numVertices比你預期的要大。 為什么不在分配之前輸出它以確保。

還要考慮您的Graph或應用程序中的其他對象也可能正在使用堆空間。

您似乎面臨的情況是堆內的任何區域(例如eden,survivor或old)都不足以容納您嘗試分配的數據結構。 例如 - 您的5G堆默認情況下可以划分如下(請注意,這是特定於平台的):

  • 伊甸園1.5G
  • 兩個幸存者空間各0.25G
  • 老3G

通過調整不同區域的比率,更細粒度的配置將為您排序。

暫無
暫無

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

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