1、如果你没有使用OkHttpClient单例模式的话,而是每次都new 一个OkHttpClient 在大量的请求下,很容易就会出现OOM 因为OkHttpClient 每new 一个 就会创建一个线程池,线程池默认有5个线程,不断new 就会出现OOM
2、在使用OkHttpClient 单例模式的情况下,出现IOException和EOFException 类似如下:
java.io.IOException: unexpected end of stream on Connection{xxx, proxy=DIRECT hostAddress= cipherSuite=none protocol=http/1.1}
at okhttp3.internal.http1.Http1Codec.readResponseHeaders(Http1Codec.java:208)
at okhttp3.internal.http.CallServerInterceptor.intercept(CallServerInterceptor.java:88)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:45)
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.wondersgroup.mall.ucenter.common.utils.HttpUtils.syncGet(HttpUtils.java:43)
at com.wondersgroup.mall.ucenter.common.utils.HttpUtils.main(HttpUtils.java:77)
Caused by: java.io.EOFException: \n not found: limit=0 content=…
at okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:237)
at okhttp3.internal.http1.Http1Codec.readHeaderLine(Http1Codec.java:215)
at okhttp3.internal.http1.Http1Codec.readResponseHeaders(Http1Codec.java:189)
... 17 more
这种情况是 OkHttpClient 复用了之前的连接,但是服务器已经关闭连接,而出现的异常。简单介绍一下,OkHttpClient 内部维护一个连接池,当你发起一个连接时,如果请求头的connection 是keepAlive 它会维护这个连接在连接池(默认5分钟),并且当有下一次相同的http请求(请求地址相同),就会复用维护在连接池的连接,不会再进行tcp连接,但问题就这,虽然OkHttpClient 连接为5分钟,但一般服务器不会保持一个连接为5分钟,因为那样会很浪费连接,所以当你两次相同请求间隔时间很长,服务器关闭了连接(比如3分钟)就会出现上面的异常,当然如果服务器不关闭连接,那么也就不会出现。