You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OkHttp中response.close()与response.body.close()的区别及关闭方式选择

OkHttp 响应关闭的正确姿势:避免内存泄漏

直接给结论:优先调用 response.close(),这是OkHttp官方设计的统一关闭入口,能一次性释放整个响应链路的所有资源,完全不用你手动去关body、缓存响应这些零散的部分。

下面给你拆解各个方法的区别:

  • response.close():这是最省心的方式,它会递归关闭当前响应的body、cacheResponse、networkResponse里的所有关联资源,把整个请求链路的网络连接、流都彻底释放,从根源避免内存泄漏。
  • response.body().close():仅关闭当前响应的body流,但如果响应存在缓存响应或网络响应的关联body,这些资源不会被关闭,可能残留未释放的连接,有泄漏风险。
  • response.peekBody(Int).close():peekBody返回的是原body的一个独立副本,关闭它只是清理这个副本的资源,和原响应的资源没关系,一般是预览body内容后用来清理临时副本用的。
  • response.cacheResponse().close() / response.networkResponse().close():这俩是单独关闭缓存响应或网络响应的body,完全没必要手动调用——response.close()已经帮你处理了这些嵌套的响应资源。

额外提一句:如果已经完整读取了body内容(比如用response.body().string()),OkHttp会自动关闭body流,但如果读取过程中断(比如只读了一半就抛出异常),必须手动调用response.close()来释放资源,这时候用顶层的close是最稳妥的选择。

内容的提问来源于stack exchange,提问作者SMBiggs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 14:15:54