勇哥注:
一般我们通过使用windows的任务管理器来分析软件的性能问题。
通过cpu占用率、cpu时间、线程数量、句柄数量几个关键参数来分析软件存在的内在泄露、
暴句柄、吃cpu等等问题。
这里我们来研究一下vs自带的性能分析工具,勇哥之前也没有接触过。
因此此篇我与大家共同学习。
这一篇讲“内存使用率”工具。
先提供一段存在内存泄露的代码。
private void button2_Click(object sender, EventArgs e)
{
int it = (20000 * 100);
for (int i = 0; i < it; i++)
{
p.ProcessTransaction(new Customer(Guid.NewGuid().ToString()));
}
}
class Customer
{
private string id;
public Customer(string id)
{
this.id = id;
}
}
class CustomerCache
{
private List<Customer> cache = new List<Customer>();
public void AddCustomer(Customer c)
{
cache.Add(c);
}
}
class Processor
{
private CustomerCache cache = new CustomerCache();
public void ProcessTransaction(Customer customer)
{
cache.AddCustomer(customer);
}
}
点”开始“后,走到断点1处,取一张用于比较的内存印象快照。
拍好快照后如下图所示。
然后把程序跑起来,在另一处断点处,即在你认为已经出现内存泄漏的时刻,再拍一张快照。
以上过程也可以使用“诊断工具”来完成,它要更方便一些。
此时如果内存有变化,如果是增量,则是红色向上的箭头。
先点第一个快照,“对象(差异)”,蓝色数字 1199
然后,“与之对比的对象:”选择“快照#2"。
排序后,显示如下:
说明:
1.可以与其他的快照对比查看增加或减少了那些对象和大小
2.下部分的“根的路径”树显示引用上部分选中的对象,只有当引用某个对象的最后一个类型已经释放时,垃圾回收器才会清理该对象的内存
3.“引用的类型” 树显示持有上部分选中对象的引用
4.如果想看选中类型的实例则可以点击下图的图标
不过,使用此工具,勇哥发现很难定位到类似于巨量字符串拼接这样的问题代码上去。
也许还没有应用熟悉吧。
可以看到,仅定位到增量是string类型数据造成的。
如果看实例,则能显示出string的地址,但是无法看到其它信息。
2022/11/17勇哥注:
vs的此工具有个问题,就是取分析报表时总是需要无休止的加载符号。
造成生成报告很慢。
解决办法:
进入VS---工具---选项----调试----符号,看右边有个“Microsoft符号服务器”,将前面的勾去掉,(可能还有删除下面的那个缓存)。然后就不会在调试时加载了。
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

