簡體   English   中英

填充堆空間之前Java崩潰

[英]Java crashing before filling up heap space

我有這個需要處理大量數據的java模擬器。 它工作正常,但我得到一個int[100000][100][2]數組以及其他大數組。 該程序說它的內存不足。 Java.lang.outOfMemoryError

一切都很好,我只是給它更多的記憶,但它似乎總是在約300M左右耗盡即使我允許它2GB。 這一切都來自觀看任務經理。

我的系統有什么問題,或者這只是我需要處理的java事情?

@DanielPryden

操作系統:Win 7 32Bit 4GB內存

JVM命令:java -Xmx2048M -Xms2048M模擬器

錯誤數據:必須從IDE(使用IntelliJ)獲取。 我不知道如何從cmd做到這一點。 我認為這就是你要找的東西。

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at Simulator.main(Simulator.java:63)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

您可能遇到堆碎片問題。 即使您設置-Xmx2GB,上面的整數數組也需要塊連續內存。 我建議也固定最小堆大小,例如-Xms2GB。 這當然要求您的機器實際上遠遠超過2GB,因為操作系統開銷,其他進程等。

或者,您可能會重新訪問您的數據結構,看看您是否真的需要這樣一個連續的塊。 以某種方式將其分解可能會減少對大型連續內存塊的需求。

如果您在32位Windows操作系統上運行,則無法分配完整的2GB。 即使您使用Windows內部設備,您將獲得的最大可用地址空間是3GB,即使這樣,它也不會是連續的(並且JVM需要連續的空間來構建Java堆)。 實際上,使用Sun / Oracle JVM,我從來沒有能夠成功地分配大於1.5GB的堆 - 如果你使用JNI,你鏈接的任何DLL都會減少最大可能的堆在。

如果你真的需要一個大堆,我會建議你盡可能轉移到64位操作系統。 其次,正如其他答案所指出的那樣,如果你可以分配非連續的內存,那么更有可能成功。 使用LinkedList或其他結構,以單獨的塊分配數據。 這里有一點折衷; 您可能希望每個塊包含一個至少為64Kb的數組。

最后,如果您可以找到將處理拆分為單獨進程的方法,也就是運行多個Java實例,每個實例都有自己的數據集進行操作,並使用套接字或文件進行通信,那么您可能會得到更好的結果。他們。 也就是說,使用32位Windows操作系統,你仍然可能無法使用4GB內存,更不用說任何更大的內存。

堆內存分為三個空格:

  • 老一代
  • 幸存者空間
  • 伊甸園空間

默認情況下,虛擬機會在每個集合中增大或縮小堆,以嘗試將可用空間的比例保持為特定范圍內每個集合的活動對象。 此目標范圍通過參數-XX:MinHeapFreeRatio =和-XX:MaxHeapFreeRatio =設置為百分比,並且總大小在-Xms以下由-Xms以上限制。

我的jvm(1.6.26)中的默認比率是30/70,因此舊一代對象的最大尺寸受限(使用-Xmx1G)700Mb。

但是,您可以使用jvm選項調整代數。 例如,您可以使用參數-Xmx1G -XX運行您的類:NewRatio = 10並且您可以將更大的對象放在內存中。

看起來Java並不是為了在內存中保存大型單片對象(如數組)。 應用程序中內存的典型用法是一堆相對較小的對象的圖形,通常只有在所有空間中用完空間時才會得到OutOfMemoryError。

下面是一些有用的(和有趣的閱讀)文章:

5.0 Java [tm]虛擬機中的人機工程學

使用5.0 Java [tm]虛擬機調整垃圾收集

編輯 :我無法在我的盒子上重現它(Mac OS X,8Gb RAM)。 考慮到單個陣列在內存中大約需要200Mb +,我同意brettw沒有連續的這種大小的內存塊導致這個問題(不是生成大小)。 至於修復 - 使用集合與普通陣列或購買更多內存(推薦:-))

暫無
暫無

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

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