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下可能会出现对象来不及释放导致性能下降。

 

 
跟网型逆变器小干扰稳定性分析与控制策略优化研究(Simulink仿真实现)内容概要:本文围绕跟网型逆变器的小干扰稳定性展开分析,重点研究其在电力系统中的动态响应特性及控制策略优化问题。通过构建基于Simulink的仿真模型,对逆变器在不同工况下的小信号稳定性进行建模与分析,识别系统可能存在的振荡风险,并提出相应的控制优化方法以提升系统稳定性和动态性能。研究内容涵盖数学建模、稳定性判据分析、控制器设计与参数优化,并结合仿真验证所提策略的有效性,为新能源并网系统的稳定运行提供理论支持和技术参考。; 适合人群:具备电力电子、自动控制或电力系统相关背景,熟悉Matlab/Simulink仿真工具,从事新能源并网、微电网或电力系统稳定性研究的研究生、科研人员及工程技术人员。; 使用场景及目标:① 分析跟网型逆变器在弱电网条件下的小干扰稳定性问题;② 设计并优化逆变器外环与内环控制器以提升系统阻尼特性;③ 利用Simulink搭建仿真模型验证理论分析与控制策略的有效性;④ 支持科研论文撰写、课题研究或工程项目中的稳定性评估与改进。; 阅读建议:建议读者结合文中提供的Simulink仿真模型,深入理解状态空间建模、特征值分析及控制器设计过程,重点关注控制参数变化对系统极点分布的影响,并通过动手仿真加深对小干扰稳定性机理的认识。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值