首页 > 解决方案 > 在 Google App Engine Java 中,实例上的一个线程是否可能干扰另一个线程?

问题描述

在 Google App Engine 中,在 Java 8 上运行,我们看到对 servlet 的前端请求失败:

java.lang.OutOfMemoryError: GC overhead limit exceeded

但是该错误的堆栈跟踪与 servlet 无关——相反,它是从后台延迟任务的run()方法中抛出的。

这些任务通常由延迟任务 servlet 执行,当然不会由我们看到 500 错误的 servlet 执行。

我在这个问题上摸不着头脑,想知道,如果一个特定的实例同时服务于延迟任务和前端 servlet 请求,并且它因上面的 GC 错误而崩溃,它是否可以取出 servlet 线程(可能还有其他同一实例上的线程),以便它们都因相同的内存异常而失败?

所以我的问题是:实例 Google App Engine Java 8 环境中的线程隔离是否允许一个线程中的内存错误导致同一实例中的所有线程崩溃,如果是这样,所有线程中的 strack 跟踪是否相同?

更新: 查看在同一时间发生的特定实例 ID 的日志,我看到大量相同堆栈跟踪的其他示例,都在不同的用户和不同的前端 servlet 中,所以它似乎支持该理论整个实例都被破坏了,我们看到的堆栈跟踪不知何故从同一个实例上的不同线程交叉。

标签: javamultithreadinggoogle-app-enginegarbage-collection

解决方案


我在 app-engine-python 上发生了类似的事情

我在 GCP 支持下来回走动,显然罪魁祸首是他们的一个库中的内存泄漏,这会破坏我的整个实例,并且当时运行的每个请求都一起死掉。

所以是的,如果实例崩溃,所有进程都会死掉。


推荐阅读