【发布时间】:2014-04-25 14:48:28
【问题描述】:
我的 java 类读入一个 60MB 的文件,并产生一个 HashMap 和一个 HashMap 超过 3 亿条记录。
HashMap<Integer, HashMap<Integer, Double>> pairWise =
new HashMap<Integer, HashMap<Integer, Double>>();
我已经将 VM 参数调整为:
-Xms512M -Xmx2048M
但系统仍然适用:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.HashMap.createEntry(HashMap.java:869)
at java.util.HashMap.addEntry(HashMap.java:856)
at java.util.HashMap.put(HashMap.java:484)
at com.Kaggle.baseline.BaselineNew.createSimMap(BaselineNew.java:70)
at com.Kaggle.baseline.BaselineNew.<init>(BaselineNew.java:25)
at com.Kaggle.baseline.BaselineNew.main(BaselineNew.java:315)
在不因 OOME 失败的情况下运行需要多大的堆?
【问题讨论】:
-
尝试构建 300mio x 300mio 相似度矩阵是一个非常糟糕的主意,即使您有 2gb 的堆。
-
使用简化的测试,我测量了
Map.Entry<Integer, Double>的 90 个字节,因此 3 亿个条目至少需要 25GB(可能比这还要多,因为您还会有一堆Map.Entry<Integer, HashMap<...>>和内存中的其他东西)
标签: java jvm heap-memory jvm-arguments