2014-03-28 18 views
-1

我們遇到錯誤「java.lang.OutOfMemoryError:要求數組大小超過VM限制」在日誌文件中,也觀察其他過程中也出現此錯誤錯誤後運行進程的原因 - java.lang.OutOfMemoryError:請求的數組大小是否超出VM限制?

  1. 後運行服務器爲什麼不停止等上述錯誤後進程也運行?
  2. 是否所有的java.lang.OutOfMemoryError錯誤都會阻塞整個應用程序?
  3. 假設有10個線程,其中一個線程由於OutofMemory錯誤而失敗。在這種情況下將所有的線程會被阻塞或其他9個線程將繼續該過程

實施例記錄器的消息:

示例...(QuartzScheduler.java:2166) - 工作(DEFAULT.jobLaunchStatusPoller org.quartz.SchedulerException:作業拋出未處理的異常[請參閱嵌套異常:java.lang.OutOfMemoryError:請求的數組大小超過VM限制] at org.quartz.core.JobRunShell.run(JobRunShell.java :210) at org.quartz.simpl.SimpleThreadPool $ WorkerThread.run(SimpleThreadPool.java:546) 由:java.lang.OutOfMemoryError引起:請求的數組大小爲exce eds VM limit [Mar 17 13:32:24] [3578814] WARN [PollingScheduler_Worker-19](JobExecutor.java:54) - Job Execution Started。

謝謝。

+0

一般來說,服務器儘量不要因爲一個例外的崩潰。谷歌的'setUncaughtExceptionHandler',如果你想了解他們如何做到這一點。 – kdgregory

回答

3

OutOfMemoryError意味着JVM沒有足夠的空間爲新對象分配內存,並且垃圾回收器無法提供額外的空間。 該錯誤由導致內存溢出的指令拋出,但不會終止該線程。 OutOfMemoryError是一個可以捕捉的可拋物體。

您應該瞭解如何配置heapspace一些線索:Increase heap size in Java

+0

假設有10個線程...其中一個線程拋出OutofMemoryError ....將9個線程繼續處理或全部將被阻止 – user2323036

+0

他說已經沒有 – Leo

+0

但是我怎麼看到進程正在運行即使發生此異常之後也會記錄 – user2323036

0

啓動VM時-XmX參數,使您可以更改分配給JVM的內存。

java -XmX100G myClass 

但是,如果您希望獲得足夠的內存,其他進程可能需要它。

+0

哦,真的'100G'?太巨大了! 'G'是指千兆嗎? – Keerthivasan

+0

是的,有些人有問題,因爲他想要超過300G –

+1

因爲有些人遇到麻煩,你提供一個千兆字節的數量作爲答案在這裏?你不覺得有點誤導,我會舉一個更現實的例子。而你想慷慨大方的對面:保守。 – Gimby

0

@Thomas給出了很好的回答,但我不同意一件事。

根據Javadoc for Error類,您不應該嘗試捕獲錯誤或任何子類。

確保你將永遠不會在這裏結束和如果你期望錯誤 = 糟糕的設計/算法

+0

服務器與普通應用程序有不同的設計目標。 – kdgregory

+0

@kdgregory - 我不明白你的意思,但那。如果你的意思是,如果你有服務器應用程序運行其他應用程序或運行在另一個服務器應用程序內的應用程序? 因此,你會發現OutOfMemory錯誤並做什麼? (我看不到一些可能的用例,但是這樣做的代碼會再次這樣做,您可以添加更多的內存,但是如果應用程序是貪婪且設計錯誤的,則可能會再次發生OutOfMemory錯誤。 – Lukino

+0

像Tomcat這樣的應用程序服務器不能關閉,因爲在處理一個請求時發生了問題,這與你的操作系統由於行爲不當而不關閉計算機的原因是一樣的 – kdgregory

相關問題