簡體   English   中英

如何修復Java中“請求的數組大小超過VM限制”錯誤?

[英]How to fix “Requested array size exceeds VM limit” error in Java?

是否有一個日志選項可以讓tomcat記錄錯誤的查詢而不是拋出這個?

SEVERE:java.lang.OutOfMemoryError:請求的數組大小超過VM限制

(嘗試將日志級別設置為FULL,但僅捕獲上述內容)

這還不足以進一步調試
或者,如果可以通過調整以下內容來分配更多內存來修復此問題?

-Xms1024M -Xmx4096M -XX:MaxPermSize = 256M

更新

-Xms6G -Xmx6G -XX:MaxPermSize = 1G -XX:PermSize = 512M

(以上看起來效果更好,繼續監控)

我懷疑你可能在大型索引上使用排序。 這是我必須知道的一件事,Lucene需要一個大的數組大小。 無論哪種方式,您可能希望嘗試使用具有以下選項的64位JVM:

-Xmx6G -XX:MaxPermSize=128M -XX:+UseCompressedOops

最后一個選項會將64位內存指針減少到32位(只要堆低於32GB)。 這通常會將內存開銷降低約40%,因此可以顯着延長內存。

更新:您很可能不需要如此龐大的永久代尺寸,當然不是1G。 你可能對128M很好,如果你繼續使用Java 6,你會得到一個特定的錯誤。由於你的服務器限制為8G,你可能能夠通過7G獲得更小的燙發堆根。 小心不要進入交換,這會嚴重減慢Java的速度。

我注意到你在更新中沒有提到-XX:+UseCompressedOops 如果你還沒有嘗試過,那可能會產生很大的不同。 你可以通過減少伊甸園的大小來擠出更多的空間,給予終身一代更大的空間。 除此之外,我認為你只需要更多的內存或更少的排序字段。

如果您想找出導致OutOfMemory的原因,您可以添加

-XX:+HeapDumpOnOutOfMemoryError 

你的java選擇。

下次內存不足時,您將獲得一個堆轉儲文件,可以使用位於jdk / lib中的“jhat”進行分析。 Jhat將向您顯示堆中存在的對象以及它們消耗的內存量。

您將獲得此異常,因為您正在嘗試創建一個大於Java VM堆中最大連續內存塊的Array。

https://plumbr.eu/outofmemoryerror/requested-array-size-exceeds-vm-limit

解決辦法是什么?

java.lang.OutOfMemoryError:請求的數組大小超過VM限制可能由於以下任一情況而出現:

您的陣列變得太大,最終的大小在平台限制和Integer.MAX_INT之間

您故意嘗試分配大於2 ^ 31-1元素的數組來試驗限制。

在第一種情況下,檢查您的代碼庫以確定您是否確實需要大型數組。 也許你可以減少數組的大小並完成它。 或者將陣列分成較小的塊,並按照適合您的平台限制的批量加載您需要使用的數據。

在第二種情況下 - 記住Java數組是由int索引的。 因此,在平台中使用標准數據結構時,您不能超越陣列中的2 ^ 31-1個元素。 事實上,在這種情況下,編譯器在編譯時宣布“錯誤:整數太大”的編譯器已經阻止了你。 但如果您真的使用真正的大型數據集,則需要重新考慮您的選擇。 您可以以較小的批量加載需要使用的數據,並且仍然使用標准Java工具,或者您可能超出標准實用程序。 實現此目的的一種方法是查看sun.misc.Unsafe類。 這允許您直接分配內存,就像在C中一樣。

我在catalina.sh使用它

JAVA_OPTS="-Dsolr.solr.home=/etc/tomcat6/solr -Djava.awt.headless=true -server -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+DisableExplicitGC"

我從未在Tomcat / solr上遇到過30M小文檔的mem問題。 我遇到了solrJ索引客戶端的問題。 我不得不為Java客戶端使用-Xms8G -Xmx8G ,並通過250K文檔塊添加文檔。

內存不足! 查看是否有數組越界,或循環系統資源被吞沒!


  1. java.lang.OutOfMemoryError:Java堆空間在JVM中,如果98%的時間可用於GC堆大小,則少於2%的時間拋出此異常信息。 JVM堆設置是java程序運行的JVM內存空間,可用於部署設置。 JVM在啟動時自動設置堆大小值,初始空間(即-Xms)是物理內存的1/64,最大空間(-Xmx)是物理內存的1/4 .JVM可用於提供 - 可以設置Xmn-Xms-Xmx和其他選項。

  2. 請求的數組大小超過VM限制:這是因為數組大小的應用程序超出了堆空間的大小,例如數組中的256M堆空間要申請512M

升級solr到更新的版本似乎已經解決了這個問題,可能更新的版本有更好的堆內存管理。

暫無
暫無

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

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