【问题标题】:Why do I get an OutOfMemoryError when load-testing a Swagger-Webservice为什么在负载测试 Swagger-Webservice 时会出现 OutOfMemoryError
【发布时间】:2019-11-26 20:27:32
【问题描述】:

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

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

【问题讨论】:

    标签: java openapi openapi-generator


    【解决方案1】:

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

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

    解决方案是在您的应用程序中重复使用 ApiClient-instances 或切换到基于客户端的例如在春天RestTemplate

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多