我们开发了一种MicroService,可通过辅助系统进行访问。两种系统都使用Swagger / OpenApi API与彼此通信。我们将客户端生成为“ java”(位于okhttp-Client之下)。
一段时间后,当我们对系统进行负载测试时,尽管系统配置了足够的内存(通过-Xmx),但在客户端上却得到java.lang.OutOfMemoryError: unable to create new native thread
。
我们如何避免这种情况?怎么了?
答案 0 :(得分:1)
OpenApi生成“ java”客户端,以便每个ApiClient
实例包装一个OkHttpClient
实例。 OkHttpClient
的文档指出,每个实例都创建一个ThreadPool
以及一个缓存。它还指出,OkHttpClient
-实例应该在多个请求之间共享。
如果不执行此操作,并且每个呼叫生成一个ApiClient
,则将泄漏Thread
。一旦垃圾回收消除了未使用的ApiClient
实例,这些数据就会被恢复,但是,如果您的系统配置了足够的内存,则此gc调用可能不会足够频繁地发生,并且最终可能会有更多请求的本机线程,则底层操作系统无法提供。
解决方案是在应用程序中重复使用ApiClient
实例,或切换到基于客户端的实例,例如在春季RestTemplate
上。
对于那些好奇的人:OkHttpClient
似乎保留了线程来处理异步http / 2请求-如果您的应用程序实际上没有进行异步调用,这有点过头了。