.NET应用程序调试—原理、工具、方法(12)
来源:未知 责任编辑:责任编辑 发表时间:2015-05-17 16:44 点击:次
HistRoot
HistObj
HistObjFind
HistClear
7.简单示例,常见的线上两类问题
这里我们使用两个小示例直观的感受一下接触.NET运行时状态的感受,尽管真实的问题可能比这个复杂很多,但是解决问题的思路是一样的。
7.1.内存问题(内存偏高,内存溢出)
服务程序最怕的性能问题之一就是内存,当内存很高的情况下我们能够通过对dump文件进行查看,看哪些对象导致内存一直高。当内存一直高的情况下就会容易导致内存溢出异常,甚至是GC频繁的执行,当GC一执行就会导致服务并发下降,因为它要挂起所有的线程(这里指的是服务器模式的.NETCLR,相对应的还有工作站模式的.NETCLR)。
namespace OrderManager { class Program { static void Main(string[] args) { Console.WriteLine("app begin..."); Console.ReadLine(); List<byte[]> l = new List<byte[]>(); for (int i = 0; i < 9999999; i++) { byte[] b = new byte[1000]; l.Add(b); Console.WriteLine(i); } Console.WriteLine("end begin..."); Console.ReadLine(); } } }
这一段代码会一直分配内存直到最后内存溢出异常终止程序,我们在内存比较的情况下来获取一个dump文件,然后通过适当的命令来定位哪个对象占用内存过高。
在不知道对象类型的情况下比较简单的方式就是使用:0:000> !dumpheap -stat,命令,该命令的意思是统计当前堆的信息,在这里就可以一眼找到哪个对象占用多少内存。
0:000> !dumpheap -stat
Statistics:
MT Count TotalSize
Class Name
相关新闻>>
- 发表评论
-
- 最新评论 更多>>