《Advanced .NET Debugging》 读书笔记 Listing 5-2: GC代龄的示例
2010-12-31 00:53
495 查看
代码如下:
2. 执行到需要按键继续处, 先执行 .loadby sos.dll mscorwks
3. 再执行 .load sosex.dll
4. 执行 !eeheap –gc 可看到各代龄对象的统计状况。执行!clrstack –a 可以看到对象指向的heap地址:
可见该对象已经指向的heap地址0x000000002424358已经位于代龄0的地址0x0000000002425630和代龄2的地址0x0000000002401018之间,可见该对象在经过一次gc之后,已经成了代龄为1的对象。
using System;
using System.Text;
using System.Runtime.Remoting;
namespace Advanced.NET.Debugging.Chapter5
{
class Name
{
private string first;
private string last;
public string First { get { return first; } }
public string Last { get { return last; } }
public Name(string f, string l)
{
first = f; last = l;
}
}
class Gen
{
static void Main(string[] args)
{
Name n1 = new Name("Mario", "Hewardt");
Name n2 = new Name("Gemma", "Hewardt");
Console.WriteLine("Allocated objects");
Console.WriteLine("Press any key to invoke GC");
Console.ReadKey();
n1 = null;
GC.Collect();
Console.WriteLine("Press any key to invoke GC");
Console.ReadKey();
GC.Collect();
Console.WriteLine("Press any key to exit");
Console.ReadKey();
}
}
}
1. 在WinDbg里载入05Gen.exeusing System.Text;
using System.Runtime.Remoting;
namespace Advanced.NET.Debugging.Chapter5
{
class Name
{
private string first;
private string last;
public string First { get { return first; } }
public string Last { get { return last; } }
public Name(string f, string l)
{
first = f; last = l;
}
}
class Gen
{
static void Main(string[] args)
{
Name n1 = new Name("Mario", "Hewardt");
Name n2 = new Name("Gemma", "Hewardt");
Console.WriteLine("Allocated objects");
Console.WriteLine("Press any key to invoke GC");
Console.ReadKey();
n1 = null;
GC.Collect();
Console.WriteLine("Press any key to invoke GC");
Console.ReadKey();
GC.Collect();
Console.WriteLine("Press any key to exit");
Console.ReadKey();
}
}
}
2. 执行到需要按键继续处, 先执行 .loadby sos.dll mscorwks
3. 再执行 .load sosex.dll
4. 执行 !eeheap –gc 可看到各代龄对象的统计状况。执行!clrstack –a 可以看到对象指向的heap地址:
此时可以发现,local指向的heap对象地址0x00000000024b3900 比generation 0的地址 0x0000000002401030还要大,可见其处于带龄0.
5. 当执行一次GC之后,再次重复以上过程,可得:可见该对象已经指向的heap地址0x000000002424358已经位于代龄0的地址0x0000000002425630和代龄2的地址0x0000000002401018之间,可见该对象在经过一次gc之后,已经成了代龄为1的对象。
相关文章推荐
- 《Advanced .NET Debugging》 读书笔记 Listing 5-3: Object的Roots的示例
- 《Advanced .NET Debugging》 读书笔记 Listing 6-3: 取得Lock的简单示例
- 《Advanced .NET Debugging》 读书笔记 Listing 6-4: Deadlock的简单示例
- 《Advanced .NET Debugging》 读书笔记 Listing 6-6: Orphaned locks的简单示例
- 《Advanced .NET Debugging》 读书笔记 Listing 6-8: Orphaned lock的示例
- 《Advanced .NET Debugging》 读书笔记 Listing 5-5: LOH的简单示例
- 《Advanced .NET Debugging》 读书笔记 Listing 5-6: Pining的简单示例
- 《Advanced .NET Debugging》 读书笔记 Listing 5-8: Fragmentation的简单示例
- 《Advanced .NET Debugging》 读书笔记 Listing 3-6: 使用sxe在程序载入mscorwks之后停下来载入sos
- 《Advanced .NET Debugging》 读书笔记 Listing 3-7: 为notepad设置断点的过程
- 《Advanced .NET Debugging》 读书笔记 Listing 3-10到3-14: 得到程序中各对象的内容
- 《Advanced .NET Debugging》 读书笔记 Listing 3-8/3-9: 为托管代码设置断点的过程
- 《Advanced .NET Debugging》 读书笔记 Listing 3-1: 调试器的使用
- 《Advanced .NET Debugging》 读书笔记 Listing 3-16: 显示托管代码的Call Stack
- 《Advanced .NET Debugging》 读书笔记 Listing 2-7: 使用debugger查看对象的syncblk的数据
- 《Advanced .NET Debugging》 读书笔记 Listing 4-4: 调试Assembly加载失败的程序
- 《Advanced .NET Debugging》 读书笔记 Listing 3-2: 如何查看程序的PID
- 《Advanced .NET Debugging》 读书笔记 Listing 5-4: 具有Finalize方法的简单对象
- 《Advanced .NET Debugging》 读书笔记 Listing 3-3: 使用debugger调试一个已经在运行的程序
- 《Advanced .NET Debugging》 读书笔记 Listing 2-5/2-6: 使用debugger找到value type和reference type