2014-03-28 17 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

相关问题