• 14
  • 14
分享
  • 分享一次性能测试中的内存泄漏案例——软件测试圈
  • 曼倩诙谐 2021-09-03 10:29:15 字数 1197 阅读 2077 收藏 14

  最近性能测试中遇到了一个内存泄漏相关的案例,在这里与大家分享。

  什么是内存泄漏?

  内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果[1]。

  由于内存泄漏导致的缺陷具有隐蔽性、累积性的特点,技术人员通常不会直接观察到相关错误症状,而是通过系统性能表现逐渐降低或系统崩溃发现此类缺陷。

  怎样发现内存泄漏缺陷?

  疲劳测试是一般采用混合交易场景(待测交易按照一定比例),以一定的压力(通常不低于目标TPS)执行压力测试,验证混合场景长时间执行情况下系统的性能表现。

  疲劳测试能够验证混合场景下系统有无长时间无故障稳定运行的能力,是否有内存泄漏等性能问题。

  一般推荐测试执行时长不低于4小时(交易量大于日交易量)。

  系统若存在内存泄漏问题,通常会在疲劳测试的过程中发现此类缺陷。

  测试过程

  测试背景

  应用程序部署在PaaS上,PaaS资源为1个2C4G的pod;使用Oracle数据库,铺底数据500万,造数逻辑为一个客户ID对应5个不同的关联人ID,每个关联人ID下有10个产品。

  每次发起参数为客户ID的查询请求时,将返回50条产品信息。

  监控过程

  疲劳测试时,4个并发用户的情况下,TPS先保持正常,运行40分钟左右TPS逐渐下降、响应时间上升,直到服务报错、出现失败的请求。

  持续一段时间后,响应时间恢复正常、TPS恢复正常,这一现象周期反复出现。

1-1.jpg

  监控发现,TPS下降期间的CPU使用率一直在2C附近,接近100%使用;凌晨2:40左右疲劳测试结束后,CPU使用率恢复正常。

1-2.jpg

  通过使用性能监控工具Dynatrace发现,ParOldGen用满后不回收,交易挂起量增多,响应时间长。

  生成HeapDump时,会被动执行GC,即内存回收,此时对应时间点的TPS上升,恢复正常。不使用上述方法,平均1个小时会主动回收一次,然后循环往复。

  再并未主动内存回收的一个小时内,响应时间逐渐增大,TPS降低。

1-3.jpg

  同时监控数据库服务器,发现数据库服务器的CPU和内存使用率并不高。初步判断程序存在内存泄漏问题,风险较大。

  分析并解决问题

  通过阅读程序代码,发现SQL语句并不复杂,只涉及到简单的where条件查询和group by分组。

  但程序中出现了与下面代码类似的逻辑:

1-4.png

  由于for循环体中出现了大量创建ArrayList对象的操作,导致大量内存被消耗得不到释放。修改代码逻辑如下:

1-5.png

  通过将创建对象的过程放在for循环外,避免了内存的多次分配与过多占用,从而提升了应用程序的性能表现,解决了内存泄漏的问题。

  [1]王皓. 一种内存泄漏检测技术的研究和实现[D].北京交通大学,2008.



作者:张东宇   

来源:51Testing软件测试网原创

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   本文是一篇利用AI生成测试用例的实战内容,包括AI原理及测试用例生成过程两方面,接下来先看看测试界面及生成的测试用例效果展示。  一 训练结果  测试页面  下图这是我的测试页面:  AI模型生成的测试用例:  二 Kimi AI 模型介绍  地址:https://kimi.moonshot.cn/chat/cnjrkho3r0737glhtm80  Kimi AI模型是由月之暗面科技有限公司(Moonshot AI)开发的智能助手。它的核心能力在于处理长文本,支持长达20万汉字的输入,这在全球大模型产品中是一个显著的特点。Kimi AI能够处理多种类型的文件和来自不同网站的内容,包括PD...
            0 0 1637
            分享
          • HTTP, HTTPS协议什么是DNSDNS是域名系统(Domain Name System),DNS是用来做域名解析的,它会在你上网输入网址后,把它转换成IP,然后去访问对方服务器;没有它,你想上百度就要记住百度的IP,但有了DNS的处理,你只需要记住对应网站的域名,即网址就可以了。HTTP协议HTTP协议:超文本传输协议,是基于TCP的协议,默认为80端口。它的作用是用来规定客户端和服务器的数据传输格式。是一种用于请求与响应模式的、无状态、无连接 的应用层协议。 由于HTTP协议是一种请求-响应模式,所以一般需要关注HTTP请求和HTTP响应。怎么抓取HTTPS协议使用fiddler工具抓...
            0 1 1066
            分享
          • 思考的高度决定人生的高度,最近小编从领导那里get了一项新的技能,分享给大家。其实,在我们工作中,面临着很多的事情,突发的或例行的,如果不经常思考或总结,将会面临Todo delay,工作效率比较低,长时间段内无进步。  一、什么是有高度的问题  小编先带领大家了解下"钢铁大王"卡内基的故事。通过他的故事道出什么是有高度的问题。  "钢铁大王"卡内基,16岁时,来到美国西部铁路管理局当差,负责收发电报。一天,卡内基收到一封发给局长的加急电报:"货车在阿尔图纳单轨路线上已堵塞4小时,请尽快给出处理意见。"他带着电报去汇报,这才知道局长外...
            0 0 2317
            分享
          •   测试面试话题1:敏捷开发与测试  以下是我个人总结的一些经验:  传统开发模式:V模式,瀑布模式。传统开发模式往往循规蹈矩,从需求,概要设计,详细设计,开发,单元测试,集成测试,系统测试,验收测试,上线发布,整个周期往往需要半年到一年,由于周期长,产品在开发过程中会存在需求变化,传统模式不适应需求的变化。为了解决这个问题,当前出现了敏捷模式。  敏捷分为敏捷开发和敏捷测试,特点和特征是:  1. 测试驱动开发和行为驱动测试  测试驱动开发是指开发先写单元测试,再写开发的代码,当单元测试跑通的时候,代码开发就完成了。  行为驱动测试是通过直接写user story,例如Cucumber框架,...
            0 0 1253
            分享
          • 1、选择一门编程语言自动化脚本根据脚本分为两种:录制脚本和编程语言编程的脚本,学习自动化肯定是要用语言开发测试脚本,所以需要选择一门编程语言。流行的是JAVA和Python,这个要取决于你对那种语言更熟悉一些,同时要看测试团队所使用的语言,如果团队用Java,那你就学Java。如果你既没有语言基础,测试团队也没有指定的语言,那么我建议你学Python,Python相对Java更简单,学习成本要低一些,这里选择Python作为编程测试脚本的语言。2、了解自动化测试框架很多人都听过自动化测试框架,为什么会有自动化测试框架?因为框架提供了很多基础功能,还可以自己封装一些重复的代码模块,这样我们调用比...
            0 2 4547
            分享
      • 51testing软件测试圈微信