为什么进程在错误后运行-java.lang.OutOfMemoryError:请求的数组大小超过VM限制?

为什么进程在错误后运行-java.lang.OutOfMemoryError:请求的数组大小超过VM限制?,java,Java,我们在日志文件中遇到错误“java.lang.OutOfMemoryError:请求的数组大小超过VM限制”,并且我们还观察到其他进程也在该错误后运行 为什么在发生上述错误后,服务器没有停止,其他进程也在运行 所有java.lang.OutOfMemoryError错误是否会阻止整个应用程序 假设有10个线程,其中一个线程因OutofMemory错误而失败。在这种情况下,所有线程都将被阻塞,或者其他9个线程将继续该进程 记录器消息示例: 示例…(QuartzScheduler.java:2166

我们在日志文件中遇到错误“java.lang.OutOfMemoryError:请求的数组大小超过VM限制”,并且我们还观察到其他进程也在该错误后运行

  • 为什么在发生上述错误后,服务器没有停止,其他进程也在运行
  • 所有java.lang.OutOfMemoryError错误是否会阻止整个应用程序
  • 假设有10个线程,其中一个线程因OutofMemory错误而失败。在这种情况下,所有线程都将被阻塞,或者其他9个线程将继续该进程
  • 记录器消息示例:

    示例…(QuartzScheduler.java:2166)-作业(DEFAULT.jobLaunchStatusPoller)引发异常。 org.quartz.SchedulerException:作业引发了未处理的异常。[请参阅嵌套异常:java.lang.OutOfMemoryError:请求的数组大小超过VM限制] 位于org.quartz.core.JobRunShell.run(JobRunShell.java:210) 位于org.quartz.siml.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:546) 原因:java.lang.OutOfMemoryError:请求的数组大小超过VM限制 [Mar 17 13:32:24][3578814]警告[PollingScheduler_Worker-19](JobExecutor.java:54)-作业执行已开始


    谢谢。

    OutOfMemoryError表示JVM没有足够的空间为新对象分配内存,垃圾收集器无法提供额外的空间。 此错误由导致内存溢出的指令引发,但不会终止线程。
    OutOfMemoryError
    是一个可以捕获的可丢弃对象


    您应该阅读一些关于如何配置heapspace的线程:

    启动VM时,
    -XmX
    参数允许您更改为JVM分配的RAM

    java -XmX100G myClass 
    

    但是,请慷慨地使用您提供的内存,其他进程可能需要它。

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

    根据javadocforerror类,您不应该试图捕获Error或任何子类


    请确保您永远不会在这里结束,如果您预期错误,请假定有10个线程…其中一个线程抛出OutofMemoryError…这9个线程将继续处理还是全部被阻止,但我怎么会在日志中看到进程正在运行,即使在这一例外之后Option OccurseExample…(QuartzScheduler.java:2166)-作业(DEFAULT.jobLaunchStatusPoller引发了一个异常。org.quartz.scheduleException:作业引发了一个未处理的异常。[请参阅org.quartz.core.JobRunShell.runshell(JobRunShell.java:210)上的嵌套异常:java.lang.OutOfMemoryError:请求的数组大小超过VM限制]在org.quartz.siml.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:546)上,由以下原因引起:java.lang.OutOfMemoryError:请求的数组大小超过VM限制[Mar 17 13:32:24][3578814]警告[PollingScheduler_Worker-19](JobExecutor.java:54)-作业开始执行。哦,真的
    100G
    ?太大了!是不是
    G
    指的是千兆?是的,有些人有问题,因为他想要300多个,而有些人有麻烦。你在这里提供千兆字节的数量作为答案?有点误导,你不认为,我会给出一个更现实的例子。你想与之相反慷慨一词:保守。通常情况下,服务器尽量不因为一个异常而崩溃。如果您想了解它们是如何做到这一点的,请使用Google for
    setUncaughtExceptionHandler
    。服务器与普通应用程序有不同的设计目标。@kdgregory-我不明白您的意思,但我知道。如果您的意思是如果您有服务器应用程序在哪个应用程序上运行其他应用程序,或者由在另一个服务器应用程序中运行的应用程序运行,所以您将捕获内存错误并执行什么操作??(我看不到一些可能的用例,但这样做一次的代码将再次这样做。您可以添加更多内存,但如果应用程序贪婪且设计糟糕,则可能再次出现OutOfMemory错误。像Tomcat这样的应用服务器不能因为在处理一个请求时发生错误而关闭。这与y我们的操作系统不会因为程序出现错误而关闭计算机。我们可以继续,但是:-是的,当程序出现错误时,计算机不应该关闭,但当操作系统出现错误时,计算机应该关闭-这就是操作系统内部的问题和潜在的bug-同样的方法处理应用程序服务器。如果请求由服务器处理并转发到应用程序服务器应用程序成功,然后出现错误,这是应用程序问题。但如果第一次处理有问题,则是应用程序服务器问题,对吗?