我们开发了一个由二级系统访问的MicroService。这两个系统都使用Swagger/OpenApi API相互通信。我们以"java“的形式生成客户机(底层的okhttp)。
当我们在一段时间后对系统进行负载测试时,我们在客户机上获得了java.lang.OutOfMemoryError: unable to create new native thread,尽管系统配置了大量内存(通过-Xmx)。我们怎样才能避免这种情况?怎么啦?
发布于 2019-11-26 20:27:32
OpenApi生成"java"-Client,这样ApiClient的每个实例都包装了一个OkHttpClient实例。OkHttpClient的文档声明,每个实例都创建了一个ThreadPool和一个缓存。它还指出,应该在多个请求之间共享OkHttpClient-Instances。
如果您不这样做并每次调用生成一个ApiClient,您就会发现一些泄漏Thread,一旦垃圾回收消除了未使用的ApiClient实例,然而,如果您的系统配置了足够多的内存,这个gc调用可能会发生得不够频繁,最终您可能会收到更多请求的本地线程,超过底层操作系统所能提供的。
解决方案是在应用程序中重用ApiClient-instances,或者基于Spring RestTemplate切换到客户端。
对于那些好奇的人来说:OkHttpClient似乎保留了线程来处理异步http/2请求--如果应用程序实际上不执行异步调用,这就有点过分了。
https://stackoverflow.com/questions/59058870
复制相似问题