注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易杭州 QA Team

务实 专注 分享 做有态度的QA

 
 
 
 
 

日志

 
 

XStream导致JVM内存问题及其定位  

来自张翱   2013-01-28 16:27:19|  分类: 性能测试 |举报 |字号 订阅

  下载LOFTER 我的照片书  |

RESTful架构在当前的WEB服务中得到了越来越广泛的应用。它的核心是资源,通过HTTP协议进行操作,而用以传递资源的状态的主要形式是XMLJSON。本文介绍的就是在基于RESTfulWEB服务中使用XML和对象的序列化及反序列化所遇到的问题。

该项目中使用的XML序列化工具是thoughtworks公司发布的XStream,网上能找到许多XStream和其他功能相近的类库之间的比较文档,XStream以其使用方便,快速高效的特点,赢得了很多开发人员的青睐。但其在使用中也存在一定的误区。

    发现该问题的现象是,在性能测试中某个接口的每秒请求数较小,响应曲线不稳定,存在逐渐下降的趋势,如图一所示
xstream问题定位 - 网易杭州QA - 网易杭州 QA Team
图一:每秒请求数曲线存在下降趋势

         一开始怀疑是JVM垃圾回收的问题,查看gc日志,发现young gc的时间会越来越长,甚至达到一次需要100ms的程度。第一个反应是通过调整gc参数来解决垃圾回收慢的问题,尝试了-XX:MaxTenuringThreshold-XX:SurvivorRatio等参数,得到的平均每秒请求数虽有提升,但响应曲线仍不稳定,存在周期性的波动,如图二

 
xstream问题定位 - 网易杭州QA - 网易杭州 QA Team
图二:每秒请求数曲线存在周期性波动

比较图一和图二的响应曲线可以发现,图二的一个周期和图一十分相似,它们的共同点是存在一个上升脉冲,接着有缓慢下降的趋势,只是图二情况下图形的周期被压缩了。现在的疑问是什么导致了响应曲线的上升脉冲呢?我们还是从gc日志入手,发现full gc的频率和图二的周期十分符合。因此,我们认为是full gc清理了堆内存,提升了系统响应性,接着就要通过实验验证这个假设了。

         在保持JVM默认参数的情况下,可以得到图一的响应曲线,我们只需要在曲线下降的过程中手动触发full gc,观察系统的响应情况就可以了。图三是使用visualvm手动触发full gc的测试结果,abc三个时间为触发点。
 
xstream问题定位 - 网易杭州QA - 网易杭州 QA Team
图三:手动触发full gc的响应曲线

 

    至此,我们大胆假设,内存中存在一些young gc难以回收且不断堆积的对象,在full gc后才得到清理,该性能问题本质上是一个内存问题。这时候就可以用jmap输出堆内存快照进行问题定位了。如图四所示,其中com.thoughtworks.xstream.core.util.CompositeClassLoader类十分可疑。询问了开发,该类是在实现XML序列化和反序列化的过程中引入的,涉及到该项目的所有接口,影响范围较广。
 
xstream问题定位 - 网易杭州QA - 网易杭州 QA Team
图四:jmap堆内存快照

 

         那到底是什么原因导致了该类对象的堆积呢?XStream官方有一段话:The XStream instance is thread-safe. That is, once the XStream instance has been created and configured, it may be shared across multiple threads allowing objects to be serialized/deserialized concurrently.XStream是线程安全的,不需要重复初始化xstream对象,每一种类型实例化一个对象即可,而正是由于开发人员错误地在每次处理请求时都实例化一个新的xstream对象,没有把相同类型的缓存起来使用,才导致了该性能问题。找到了原因再进行修改验证就轻松多了,结果如图5所示,性能有较大幅度的提升。解决了该性能问题,项目也能够如期上线了。

XStream导致JVM内存问题及其定位 - 网易杭州QA - 网易杭州 QA Team
图五:修复后性能曲线

           业界存在许多序列化和反序列化的类库和解决方案,前期调研从中挑选出简洁高效、适合自己的十分重要,在后续代码实现前关注下它们的使用方法同样关键,如果到了项目后期再进行这类问题定位和代码修复的代价就十分巨大了,毕竟这类问题的涉及面都会很广。
 
  评论这张
 
阅读(1477)| 评论(2)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016