2013-10-09 59 views
0

在我的應用程序啓動時,我創建了具有75 * 10^6容量的trove長散列集。創建大集合時產生的奇怪OutOfMemory集合

Profiler顯示,該應用程序使用1.4克。我嘗試設置-Xmx1600m,並且捕獲內存不足。

-Xmx2000m相同。

-Xmx2030m相同。

-Xmx2040m OK。

Profiler沒有看到這麼大的分配,在哪裏以及爲什麼會發生?

+1

您是否認爲我們可以從幾千英里遠的地方解決這個問題,而沒有任何細節?設置JVM選項以在OOME情況下創建堆轉儲,並使用Eclipse Memory Analyzer等一個適當的工具對其進行分析。 – ppeterka

回答

2

最有可能你的終身空間不夠大。 jvm可能不夠聰明,無法縮小其他區域以允許您連接這麼大的塊。注意CMS不進行碎片整理,因此您可以通過更小的陣列來解決此問題。

對於一個很大的集合,您可能會考慮使用堆內存。

+0

我通過減少新比率來增加終身空間-XX:NewRatio = 10(我的情況),它是作品! –

+1

@MikhailErofeev當你減少新口糧時,你增加新的空間,減少終身空間。但是,你所做的是減少垃圾的數量,從而使其成爲終身空間並減少碎片。 –