Java 为什么在负载测试Swagger Web服务时会出现OutOfMemoryError
我们开发了一个可由辅助系统访问的微服务。两个系统都使用Swagger/OpenApi相互通信。我们将客户机生成为“java”(底层okhttp客户机) 当我们在一段时间后对系统进行负载测试时,会得到Java 为什么在负载测试Swagger Web服务时会出现OutOfMemoryError,java,openapi,openapi-generator,Java,Openapi,Openapi Generator,我们开发了一个可由辅助系统访问的微服务。两个系统都使用Swagger/OpenApi相互通信。我们将客户机生成为“java”(底层okhttp客户机) 当我们在一段时间后对系统进行负载测试时,会得到java.lang.OutOfMemoryError:无法在客户端上创建新的本机线程,尽管系统配置了大量内存(通过-Xmx)。 我们如何避免这种情况?有什么问题吗?OpenApi生成“java”客户端,使得ApiClient的每个实例包装一个OkHttpClient实例。OkHttpClient的文档
java.lang.OutOfMemoryError:无法在客户端上创建新的本机线程
,尽管系统配置了大量内存(通过-Xmx)。
我们如何避免这种情况?有什么问题吗?OpenApi生成“java”客户端,使得ApiClient
的每个实例包装一个OkHttpClient
实例。OkHttpClient
的文档说明,每个实例都创建一个ThreadPool
以及一个缓存。它还指出,OkHttpClient
-实例应该在多个请求之间共享
如果您不这样做,并且每次调用都生成一个ApiClient
,您将有点泄漏Thread
s。一旦垃圾收集消除了未使用的ApiClient
实例,这些实例就会被恢复。但是,如果您的系统配置了足够的内存,则此gc调用可能不会频繁发生,并且您可能会得到比底层操作系统所能提供的更多请求的本机线程
解决方案是在应用程序中重新使用ApiClient
-实例,或切换到基于客户端的应用程序,例如基于SpringRestTemplate
对于那些好奇的人:OkHttpClient
似乎保留了处理异步http/2请求的线程——如果应用程序实际上不执行异步调用,这有点过分了