2011-03-31 203 views
11

是否有日誌選項,可以讓tomcat記錄壞的查詢,而不是扔這個?Java中如何解決「請求的數組大小超過VM限制」錯誤?

SEVERE: java.lang.OutOfMemoryError: Requested array size exceeds VM limit

(試過日誌級別爲FULL,但只捕獲以上)

這是沒有足夠的信息,以進一步調試
可選地,如果這可以固定通過分配更多的內存通過調整以下?

-Xms1024M -Xmx4096M -XX:MaxPermSize=256M

更新

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

(上述作品似乎更好,不斷監測)

+0

你可以試試'-mx8g'或'-mx16g'嗎?你有多少內存? – 2011-03-31 08:50:13

+0

對於有這個問題的服務器是8G – ajreal 2011-03-31 08:52:19

+1

我會嘗試'-mx6g'或'-Xmx6g'(做這個事情)然而它很可能這不會有任何區別。如果你有一個工具來分析堆轉儲,你也可以嘗試'-XX:+ HeapDumpOnOutOfMemoryError'。 – 2011-03-31 08:57:12

回答

0

升級的solr到更新的版本似乎有這種問題排序,可能更新的版本有更好的堆內存管理。

9

我懷疑你可能會使用一個大的索引排序。這是我確定知道的一件事情,可能需要使用Lucene的大數組大小。無論哪種方式,您可能需要使用一個64位JVM使用這些選項嘗試:

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

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

更新:最有可能你不需要這麼大的永久代大小,當然不是1G。如果你使用Java 6,你可能會遇到一個特定的錯誤。由於你的服務器只限於8G,所以你可以用7G來獲得更小的perm堆根。注意不要掉換,這可能會嚴重減慢Java的速度。

我注意到你沒有在你的更新中提到-XX:+UseCompressedOops。如果你還沒有嘗試過,那可能會有很大的不同。您可以通過縮小伊甸園的面積來縮小空間,讓年長一代擁有更多空間。除此之外,我認爲你只需要更多的內存或更少的排序字段。

0

我用這個在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" 

我從來沒有MEM問題在Tomcat/Solr的有30M的小文件。儘管我遇到了solrJ索引客戶端的問題。我必須使用-Xms8G -Xmx8G作爲Java客戶端,並以250K文檔塊爲單位添加文檔。

2

如果你想找出是什麼原因導致內存溢出,您可以添加

-XX:+HeapDumpOnOutOfMemoryError 

到Java OPTS。

下一次內存不足時,您將得到一個堆轉儲文件,可以使用位於jdk/lib中的「jhat」進行分析。 Jhat會告訴你堆中存在什麼對象以及它們消耗多少內存。

+0

遇到此選項之前,但是,無法獲得該選項的作品,tomcat抱怨一個選項未定義的錯誤 – ajreal 2011-04-18 03:40:55

0

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


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

2.Requested陣列大小超過限制VM:這是因爲數組的大小的應用程序超出堆空間的大小,諸如陣列中的堆空間一個256M申請512M

1

您將得到此異常,因爲您正嘗試創建一個大於Java VMs堆中最大連續內存塊的數組。

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中一樣。

相關問題