String变量引起的Loadrunner资源泄漏

本文通过三种不同的字符串拼接方式对比分析了在压力测试环境下TPS下降的原因,揭示了String与StringBuilder对象创建位置的不同对性能的影响。


在压力测试中,通常碰到TPS平稳持续下降的现象,通常为负载机存在资源泄漏。一般有两种:1.连接数,2.JVM内存。本文就第2种类型进行测试和分析。



 

测试数据:

1.       String方式

public int action() throws Throwable {

lr.start_transaction("string");

 

String a = "The time is "+System.currentTimeMillis();

        String b = "The time is "+System.currentTimeMillis();

        String c = "The time is "+System.currentTimeMillis();

        String d = "The time is "+System.currentTimeMillis();

        String e = "The time is "+System.currentTimeMillis();

         lr.end_transaction("stringl", lr.AUTO);

 

写了个简单的给String变量赋值的代码,使用当前时间保证每次赋值都会变化。10个线程执行30分钟。

 

测试结果:

 

TPS持续下降:

 

YGC非常频繁:

同时CPU有走高的趋势

 

 

2.       StringBuilder方式一(New对象放在Action内)

 

//new放在Action中,每次迭代都new一个对象

 

         public int action() throws Throwable {

         lr.start_transaction("StringBuilder");

         StringBuilder bf1=new StringBuilder();

         StringBuilder bf2=new StringBuilder();

         StringBuilder bf3=new StringBuilder();

         StringBuilder bf4=new StringBuilder();

         StringBuilder bf5=new StringBuilder();

         bf1.append("The time is ");

        bf2.append("The time is ");

         bf3.append("The time is ");

         bf4.append("The time is ");

         bf5.append("The time is ");

         bf1.append(System.currentTimeMillis());

        bf2.append(System.currentTimeMillis());

         bf3.append(System.currentTimeMillis());

         bf4.append(System.currentTimeMillis());

         bf5.append(System.currentTimeMillis());

        bf1.setLength(0);

         bf2.setLength(0);

        bf3.setLength(0);

         bf4.setLength(0);

         bf5.setLength(0);

         lr.end_transaction("StringBuilder", lr.AUTO);

 

TPS

         

         TPS同样会下降

 

堆内存

 

 

 

3.       StringBuilder方式二(New对象放在Action外)

 

public class Actions

{

         StringBuilder bf1=new StringBuilder();

         StringBuilder bf2=new StringBuilder();

         StringBuilder bf3=new StringBuilder();

         StringBuilder bf4=new StringBuilder();

         StringBuilder bf5=new StringBuilder();

          

         public int init() throws Throwable {

 

                   return 0;

         }//end of init

 

 

         public int action() throws Throwable {

                  

         lr.start_transaction("StringBuilder");

 

         bf1.append("The time is ");

        bf2.append("The time is ");

         bf3.append("The time is ");

         bf4.append("The time is ");

         bf5.append("The time is ");

         bf1.append(System.currentTimeMillis());

        bf2.append(System.currentTimeMillis());

         bf3.append(System.currentTimeMillis());

         bf4.append(System.currentTimeMillis());

         bf5.append(System.currentTimeMillis());

        bf1.setLength(0);

         bf2.setLength(0);

        bf3.setLength(0);

         bf4.setLength(0);

         bf5.setLength(0);

         lr.end_transaction("StringBuilder", lr.AUTO);

 

                   return 0;

         }//end of action

 

 

TPS

TPS有轻微下降,但下降幅度比前两种方式要改善很多。

 

堆内存

从内存Dump中看到StringBuilder 实例有50 10用户,每个用户new 5个对象),但仍然有其他对象占很大比重,不清楚是否是Loadrunner本身所占用。

 



 

测试结果

1.       采用String类型给变量赋值,半小时看到TPS明显下降,并且负载机CPU有上升趋势,剩余内存有下降趋势;

2.       采用StringBuilder给变量赋值,new StringBuilder对象放在Action内(每次迭代均new一次),执行半小时,现象同String类型差不多;

3.       采用StringBuilder给变量赋值,new StringBuilder对象放在Action外,执行半小时,TPS有所下降,但下降趋势比前两个场景要小很多。

 

原因分析

1.       String 类型和 StringBuffer/StringBuilder 类型的主要性能区别其实在于 String 是不可变的对象,因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,(脚本中变量取当前时间,保证每次取值不同) new 对象需要消耗资源,并且当内存中无引用对象多了以后, JVM  GC 就会开始工作,导致GC频繁;

2.       由于本次压力测试与MAMBPS有一个共同特点,TPS比较高,因此可能是对象生成速度非常快,GC来不及回收,导致对象不断累积,并且GC越来越频繁导致了CPU上升和TPS逐渐下降,一般应用的TPS较低,因此有足够时间进行回收;

3.       另外,采用Loadrunner Java Vuser方式,LR本身也会生成一些对象,在高TPS下可能会出现对象来不及释放导致性能下降。

 

 
混合动力汽车(HEV)模型的Simscape模型(Matlab代码、Simulink仿真实现)内容概要:本文档介绍了一个混合动力汽车(HEV)的Simscape模型,该模型通过Matlab代码和Simulink仿真工具实现,旨在对混合动力汽车的动力系统进行建模与仿真分析。模型涵盖了发动机、电机、电池、传动系统等关键部件,能够模拟车辆在不同工况下的能量流动与控制策略,适用于动力系统设计、能耗优化及控制算法验证等研究方向。文档还提及该资源属于一个涵盖多个科研领域的MATLAB仿真资源包,涉及电力系统、机器学习、路径规划、信号处理等多个技术方向,配套提供网盘下载链接,便于用户获取完整资源。; 适合人群:具备Matlab/Simulink使用基础的高校研究生、科研人员及从事新能源汽车系统仿真的工程技术人员。; 使用场景及目标:①开展混合动力汽车能量管理策略的研究与仿真验证;②学习基于Simscape的物理系统建模方法;③作为教学案例用于车辆工程或自动化相关课程的实践环节;④与其他优化算法(如智能优化、强化学习)结合,实现控制策略的优化设计。; 阅读建议:建议使用者先熟悉Matlab/Simulink及Simscape基础操作,结合文档中的模型结构逐步理解各模块功能,可在此基础上修改参数或替换控制算法以满足具体研究需求,同时推荐访问提供的网盘链接获取完整代码与示例文件以便深入学习与调试。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值