繁体   English   中英

Apache HttpComponents EntityUtils内存泄漏?

[英]Apache HttpComponents EntityUtils memory leak?

我在基于Java Servlet的服务器(在WebLogic 12和Oracle Enterprise Linux下运行的Java 1.7)上执行了12小时的负载测试。 测试完成后,我发现内存消耗从测试开始时的500Mb逐渐增加到大约3.5Gb(并在+/- 500Mb的范围内波动了几个小时)。 3天后(服务器在这3天内没有执行任何操作)-我再次检查了内存,并发现3.5Gb中的任何内容都没有释放。

为了确保GC正在执行,我使用jcmd疯狂进行了显式GC:

  • GC运行
  • GC.run_finalization
  • GC运行

然后,我制作了一个堆快照,并使用YourKit分析器进行了分析(与jvisualvm相同的结果)。

我注意到在闲置3天后,仍有2.5Gb的“无法访问”对象仍然存在。 典型对象的传入引用如下所示(我有约700K的此类对象):

在此处输入图片说明

我检查了Apache HttpComponents代码(HttpCore版本4.3.2),然后在EntityUtils.toString(我在服务器中使用的代码)中注意到以下奇怪的代码:

在此处输入图片说明

在我看来,由于没有关闭读者对象-它可以创建引用,最终导致我观察到的泄漏。

  • 这是Apache HttpCore EntityUtils的泄漏代码吗?
  • 还有3天和GC.run之后有这么多无法到达的对象的其他原因吗?

谢谢。

考虑延长AsyncCharConsumer如图所示这里生产具有响应内容或使用字符串HttpAsyncResponseConsumer如果需要更复杂的响应处理。

EntityUtil方法通常用于由阻塞InputStream支持的实体。 即使那样,我通常还是建议直接从内容流中使用实体内容,而不是将其转换为字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM