我们遇到错误" java.lang.OutOfMemoryError:请求的数组大小超过VM限制"在日志文件和其他进程中也运行此错误
为什么在上述错误后其他进程也在运行?
是否所有java.lang.OutOfMemoryError错误都会阻止整个应用程序?
假设有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.
感谢。
答案 0 :(得分:1)
看看:Effects of uncaught exceptions on threads from Quartz's SimpleThreadPool
Quartz为其线程设置一个未捕获的异常处理程序,捕获Throwable
,然后用新线程重新填充其线程池。
通常(没有quarz或任何其他设置UncaughtExceptionHandler),Error将传播到默认处理程序,该处理程序将退出VM并打印堆栈跟踪。所以在你的情况下:
见上文,只有失败的线程被删除
使用quartz,所有OutOfMemoryError
将以相同的方式处理(与所有其他错误一样),但是,大多数其他错误通常会使VM处于不一致状态。 "请求的数组大小超过VM限制"是一个罕见的错误,它是完全可恢复的,因为它们只影响一个线程。