为什么在对 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 请求 - 如果您的应用程序实际上不执行异步,这有点过分了来电。
我们开发了一个由二级系统访问的微服务。两个系统都使用 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 请求 - 如果您的应用程序实际上不执行异步,这有点过分了来电。