【问题标题】:In Google App Engine Java is it possible for one thread on an instance to interfere with another?在 Google App Engine Java 中,实例上的一个线程是否可能干扰另一个线程?
【发布时间】:2019-04-29 21:27:35
【问题描述】:

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

java.lang.OutOfMemoryError: GC overhead limit exceeded

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

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

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

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

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

【问题讨论】:

  • 简而言之:堆内存被定义为共享内存。如果堆内存耗尽,则所有线程都耗尽。没有“有罪的线索”。一旦没有足够的内存,每个尝试分配的线程都可能会失败,并出现一个单独的OutOfMemoryError。除非没有足够的内存来构造 OutOfMemoryError 实例。见Where is the OutOfMemoryError object created in Java。但更重要的是要理解,不是“一个线程中的内存错误”导致其他线程失败,而是没有可用内存。

标签: java multithreading google-app-engine garbage-collection


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2012-11-03
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多