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

时间:2019-11-26 20:27:32

标签: java openapi openapi-generator

我们开发了一种MicroService,可通过辅助系统进行访问。两种系统都使用Swagger / OpenApi API与彼此通信。我们将客户端生成为“ java”(位于okhttp-Client之下)。

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

1 个答案:

答案 0 :(得分:1)

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

如果不执行此操作,并且每个呼叫生成一个ApiClient,则将泄漏Thread。一旦垃圾回收消除了未使用的ApiClient实例,这些数据就会被恢复,但是,如果您的系统配置了足够的内存,则此gc调用可能不会足够频繁地发生,并且最终可能会有更多请求的本机线程,则底层操作系统无法提供。

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

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