Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么在负载测试Swagger Web服务时会出现OutOfMemoryError_Java_Openapi_Openapi Generator - Fatal编程技术网

Java 为什么在负载测试Swagger Web服务时会出现OutOfMemoryError

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的文档

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

当我们在一段时间后对系统进行负载测试时,会得到
java.lang.OutOfMemoryError:无法在客户端上创建新的本机线程
,尽管系统配置了大量内存(通过-Xmx)。 我们如何避免这种情况?有什么问题吗?

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

如果您不这样做,并且每次调用都生成一个
ApiClient
,您将有点泄漏
Thread
s。一旦垃圾收集消除了未使用的
ApiClient
实例,这些实例就会被恢复。但是,如果您的系统配置了足够的内存,则此gc调用可能不会频繁发生,并且您可能会得到比底层操作系统所能提供的更多请求的本机线程

解决方案是在应用程序中重新使用
ApiClient
-实例,或切换到基于客户端的应用程序,例如基于Spring
RestTemplate

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