为什么在对 Swagger-Webservice 进行负载测试时会出现 OutOfMemoryError

Why do I get an OutOfMemoryError when load-testing a Swagger-Webservice

我们开发了一个由二级系统访问的微服务。两个系统都使用 Swagger/OpenApi API 相互通信。我们将客户端生成为 "java"(底层 okhttp-Client)。

当我们在一段时间后对系统进行负载测试时,我们在客户端上得到 java.lang.OutOfMemoryError: unable to create new native thread,尽管系统配置了足够的内存(通过 -Xmx)。 我们怎样才能避免这种情况?怎么了?

OpenApi 生成 "java"-Client,这样 ApiClient 的每个实例都包装了 OkHttpClient 的一个实例。 OkHttpClient 的文档指出,每个实例都会创建一个 ThreadPool 以及一个缓存。它还指出,OkHttpClient-实例应在多个请求之间共享。

如果您不这样做并在每次调用时生成一个 ApiClient,您将有点泄漏 Thread。一旦垃圾收集消除了未使用的 ApiClient 实例,这些就会被恢复,但是,如果您的系统配置有足够的内存,则此 gc 调用可能不会足够频繁地发生,并且您最终可能会请求更多的本机线程,比基础 os 可以交付。

解决方案是在您的应用程序中重复使用 ApiClient 个实例,或者切换到基于客户端的实例,例如在 Spring RestTemplate 上。

出于好奇:OkHttpClient 似乎保留线程来处理异步 http/2 请求 - 如果您的应用程序实际上不执行异步,这有点过分了来电。