我们有一个部署在CloudFoundry中的Java应用程序,由于请求具有较大的有效负载,因此偶尔会抛出OOM错误。 发生这种情况时,CloudFoundry会杀死该应用并重新启动它。
当应用程序在开发机器(而不是CF)上运行时,OOM不会导致崩溃(但会在输出中显示"堆内存和#34;消息);通常请求处理程序线程结束,并且为请求分配的内存是垃圾收集的。应用程序继续运行并成功提供更多请求。
有没有办法配置CF以避免在OOM上重新启动应用程序?
感谢。
答案 0 :(得分:1)
简短的回答是否定的。当您超出分配给它的内存限制时,该平台将始终终止您的应用程序。这是预期的行为。你不能绕过这个,因为这实际上意味着你的应用程序没有内存限制。
另外,如果您还没有,我强烈建议您使用Java buildpack v4.x(最新版本)。配置JVM要好得多,就像JVM OOME一样,你会得到有意义的错误,而不仅仅是让你的应用程序崩溃。当发生这种情况时,它还会转储有用的诊断信息,以指导您找到问题的根源。
另一个旁注......
OOM不会导致崩溃(但在输出中显示“out of heap memory”消息);通常请求处理程序线程结束,为请求分配的内存被垃圾收集。
您不想依赖此行为。一旦OOME发生在JVM中,所有的赌注都会被取消。它可能能够恢复,它可能会使您的应用程序进入一个可怕且无法使用的状态。没有办法知道,因为没有办法确切知道OOME会在哪里发生攻击。当您获得OOME时,最佳方法是获取所需的任何诊断信息并重新启动。这正是Java buildpack(v4 +)在您的应用程序在CF上运行时的作用。
希望有所帮助!