java - 如何设置 okhttp 3 线程池大小
问题描述
请问,我使用okhttp作为网络转发。TPS的峰值时间在10000左右。我模拟了网络,发送了10000次。测试用例 :
for(int i = 0; i < 10000; i++)}{
/ / okhttp3 net forward
}
然后我用Java visualvm查看线程数,发现线程数在增加,接近请求数。当请求数达到2000左右时,程序出现内存溢出错误。
Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:714)
at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:949)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1371)
at okhttp3.ConnectionPool.put(ConnectionPool.java:153)
at okhttp3.OkHttpClient$1.put(OkHttpClient.java:163)
at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:266)
at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:135)
at okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:114)
at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:126)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:200)
at okhttp3.RealCall.execute(RealCall.java:77)
at com.nantian.easytrade.http.util.HttpCallHandle.execute(HttpCallHandle.java:331)
at com.nantian.easytrade.http.util.HttpCallHandle.call(HttpCallHandle.java:191)
at com.nantian.easytrade.http.util.HttpCallHandle.call(HttpCallHandle.java:176)
at com.test.Main.main(Main.java:28)
作为android网络请求,这可能不是问题,但作为Java应用发出请求,发送线程的数量在某些时候会很高。线程过多会导致应用程序处理缓慢或出错。Okhttp3版本是3.11.0 jdk版本是1.7
解决方案
推荐阅读
- powershell - Error setting alias in PowerShell to Java platform
- c - 如何静态构建使用 CGO 的 Go 文件?
- java - JDK 1.8.x 的要求检查失败!检测到的版本:3.0.0
- reactjs - 如果使用带有元素样式 Reactjs 的 useRef() 条件,UI 不会更新
- azure - 为什么此 Azure 资源管理器模板验证失败?
- kubernetes - Kubernetes 生命周期命令未运行
- node.js - 如何在 MongoDB 中管理连接
- r - 匹配相同的列
- python - 从 Pandas Dataframe 创建 Networkx 有向图时如何创建多线节点标签
- python - 如何使用moviepy反转视频和音频剪辑?