为什么其他进程仍在运行当应用程序遇到OutOfMemoryError时

时间:2014-03-30 19:09:47

标签: java

我们遇到错误" java.lang.OutOfMemoryError:请求的数组大小超过VM限制"在日志文件和其他进程中也运行此错误

  1. 为什么在上述错误后其他进程也在运行?

  2. 是否所有java.lang.OutOfMemoryError错误都会阻止整个应用程序?

  3. 假设有10个线程,其中一个线程因OutofMemory错误而失败。在这种情况下,将阻止所有线程或其他9个线程将继续进程

    示例记录器消息:

    example...(QuartzScheduler.java:2166) - Job (DEFAULT.jobLaunchStatusPoller threw an 
    exception. org.quartz.SchedulerException: Job threw an unhandled exception. [See nested      
    exception: java.lang.OutOfMemoryError: Requested array size exceeds VM limit] at 
    org.quartz.core.JobRunShell.run(JobRunShell.java:210) at 
    org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:546) Caused by: 
    java.lang.OutOfMemoryError: Requested array size exceeds VM limit [Mar 17 13:32:24] 
    [3578814] WARN [PollingScheduler_Worker-19] (JobExecutor.java:54) - Job Execution 
    Started.
    

    感谢。

1 个答案:

答案 0 :(得分:1)

看看:Effects of uncaught exceptions on threads from Quartz's SimpleThreadPool

Quartz为其线程设置一个未捕获的异常处理程序,捕获Throwable,然后用新线程重新填充其线程池。

通常(没有quarz或任何其他设置UncaughtExceptionHandler),Error将传播到默认处理程序,该处理程序将退出VM并打印堆栈跟踪。所以在你的情况下:

  1. 见上文,只有失败的线程被删除

  2. 使用quartz,所有OutOfMemoryError将以相同的方式处理(与所有其他错误一样),但是,大多数其他错误通常会使VM处于不一致状态。 "请求的数组大小超过VM限制"是一个罕见的错误,它是完全可恢复的,因为它们只影响一个线程。