《Advanced .NET Debugging》 读书笔记 Listing 5-5: LOH的简单示例
2011-01-06 22:35
495 查看
代码如下:
1. 在WinDbg中载入05LOH.exe
2. 执行.symfix
3. 在程序运行到分配内存之前,执行 !eeheap -gc结果如下:
4. 执行 !DumpHeap –startatlowerbound 0x00000000012151000:
using System;
using System.Text;
using System.Runtime.InteropServices;
namespace Advanced.NET.Debugging.Chapter5
{
class LOH
{
static void Main(string[] args)
{
LOH l = new LOH();
l.Run();
}
public void Run()
{
byte[] b = null;
Console.WriteLine("Press any key to allocate on LOH");
Console.ReadKey();
b = new byte[100000];
Console.WriteLine("Press any key to GC");
Console.ReadKey();
b = null;
GC.Collect();
Console.WriteLine("Press any key to exit");
Console.ReadKey();
}
}
}
在程序中分配了一个包含10w个元素的数组,此时它会被分配到LOH上。可以通过WinDbg验证:using System.Text;
using System.Runtime.InteropServices;
namespace Advanced.NET.Debugging.Chapter5
{
class LOH
{
static void Main(string[] args)
{
LOH l = new LOH();
l.Run();
}
public void Run()
{
byte[] b = null;
Console.WriteLine("Press any key to allocate on LOH");
Console.ReadKey();
b = new byte[100000];
Console.WriteLine("Press any key to GC");
Console.ReadKey();
b = null;
GC.Collect();
Console.WriteLine("Press any key to exit");
Console.ReadKey();
}
}
}
1. 在WinDbg中载入05LOH.exe
2. 执行.symfix
3. 在程序运行到分配内存之前,执行 !eeheap -gc结果如下:
4. 执行 !DumpHeap –startatlowerbound 0x00000000012151000:
可见此时LOH上只是零散分布了一些对象。
5. 在分配对象以后,再次执行 !DumpHeap –startatlowerbound 0x00000000012151000:可见在LOH上该10w字节长度的对象占据的大小为100024字节。
相关文章推荐
- 《Advanced .NET Debugging》 读书笔记 Listing 5-8: Fragmentation的简单示例
- 《Advanced .NET Debugging》 读书笔记 Listing 5-6: Pining的简单示例
- 《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-4: 具有Finalize方法的简单对象
- 《Advanced .NET Debugging》 读书笔记 Listing 5-1: 简单的内存分配
- 《Advanced .NET Debugging》 读书笔记 Listing 5-3: Object的Roots的示例
- 《Advanced .NET Debugging》 读书笔记 Listing 5-2: GC代龄的示例
- 《Advanced .NET Debugging》 读书笔记 Listing 3-1: 调试器的使用
- 《Advanced .NET Debugging》 读书笔记 Listing 3-6: 使用sxe在程序载入mscorwks之后停下来载入sos
- 《Advanced .NET Debugging》 读书笔记 Listing 4-1/2/3: 调试 FileNotFoundException
- 《Advanced .NET Debugging》 读书笔记 Listing 3-2: 如何查看程序的PID
- 《Advanced .NET Debugging》 读书笔记 Listing 3-16: 显示托管代码的Call Stack
- 《Advanced .NET Debugging》 读书笔记 Listing 3-7: 为notepad设置断点的过程
- 《Advanced .NET Debugging》 读书笔记 Listing 3-3: 使用debugger调试一个已经在运行的程序
- 《Advanced .NET Debugging》 读书笔记 Listing 3-8/3-9: 为托管代码设置断点的过程
- 《Advanced .NET Debugging》 读书笔记 Listing 2-5/2-6: 使用debugger找到value type和reference type
- 《Advanced .NET Debugging》 读书笔记 Listing 2-1: 找到notepad.exe的入口点